[plain] view plaincopyprint?
library(nnet); #安装nnet软件包
library(mlbench); #安装mlbench软件包
data(Vehicle); #调入数据
n=length(Vehicle[,1]); #样本量
set.seed(1); #设随机数
samp=sample(1:n,n/2); #随机选择半数观测作为训练集
b=class.ind(Vehicle$Class); #生成类别的示性函数
test.cl=function(true,pred){true<-max.col(true);cres=max.col(pred);table(true,cres)};
a=nnet(Vehicle[samp,-19],b[samp,],size=3,rang=0.1,decay=5e-4,maxit=200); #利用训练集中前18个变量作为输入变量,隐藏层有3个节点,初始随机权值在[-0.1,0.1],权值是逐渐衰减的。
test.cl(b[samp,],predict(a,Vehicle[samp,-19]))#给出训练集分类结果
test.cl(b[-samp,],predict(a,Vehicle[-samp,-19]));#给出测试集分类结果
#构建隐藏层包含15个节点的网络。接着上面的语句输入如下程序:
a=nnet(Vehicle[samp,-19],b[samp,],size=15,rang=0.1,decay=5e-4,maxit=10000);
test.cl(b[samp,],predict(a,Vehicle[samp,-19]));
test.cl(b[-samp,],predict(a,Vehicle[-samp,-19]));
再看手写数字案例
最后,我们回到最开始的那个手写数字的案例,我们试着利用支持向量机重做这个案例。(这个案例的描述与数据参见《R语言与机器学习学习笔记(分类算法)(1)》)
由于nnet包对输入的维数有一定限制(我也不知道为什么,可能在权值计算的时候出现了一些bug,反正将支持向量机那一节的代码平行的移过来是会报错的)。我们这里采用手写数字识别技术中常用的办法处理这个案例:计算数字的特征。选择数字特征的办法有许多种,你随便百度一篇论文都有叙述。我们这里采用结构特征与统计特征结合的办法计算图像的特征。
我们这里采用的统计特征与上图有一点的不同(结构特征一致),我们是将图片分为16块(4*4),统计每个小方块中点的个数,这样我们就有25维的特征向量了。为了保证结果的可比性,我们也报告支持向量机的分类结果。
运行下列代码:
[plain] view plaincopyprint?
setwd("D:/R/data/digits/trainingDigits")
names<-list.files("D:/R/data/digits/trainingDigits")
data<-paste("train",1:1934,sep="")
for(i in 1:length(names))
assign(data,as.matrix(read.fwf(names,widths=rep(1,32))))
library(nnet)
label<-factor(rep(0:9,c(189,198,195,199,186,187,195,201,180,204)))
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-32507-7.html
公司不行贿能够少纳税吗
南方黑芝麻糊