用R实现神经网络

参考用书:数据挖掘:R语言实战      黄文 王正林  编著

 

神经网络是一种运算模型,由大量的节点(或神经元)和之间的相互连接构成,每个节点代表一种特定的输出函数。
每两个节点间的连接都代表一个对于通过该连接信号的加权值,称为权重,这相当于神经网络的记忆。
神经网络分为俩类:分类和回归
注意点1难解释2会学习过度,需要恰当的使用严格衡量神经网络的方法,如测试集和交叉验证。3,费时间
nnet软件包用来建立单隐藏层的前馈人工神经网络模型,同时也能建立多项对数线性模型。
class.ind()函数用来对数据进行预处理
class.ind(cl)
cl是需要进行预处理的结果变量
nnet()函数是建立单隐藏层测前馈人人工神经网络模型,也可以建立无隐藏层的

nnet(formula, data, weights, ...,
     subset, na.action, contrasts = NULL)
nnet(x, y, weights, size, Wts, mask,
     linout = FALSE, entropy = FALSE, softmax = FALSE,
     censored = FALSE, skip = FALSE, rang = 0.7, decay = 0,
     maxit = 100, Hess = FALSE, trace = TRUE, MaxNWts = 1000,
     abstol = 1.0e-4, reltol = 1.0e-8, ...)
第一类格式中,formula代表的是函数模型的形式
data代表的是在模型中包含有变量的一组可选格式数据
weights代表的是各类样本在模型中所占的权重,该参数的默认值为1,即各类样本按原始比例建立模型
subset主要用于抽取样本数据中的部分样本为训练集
第二类格式中,x为一个矩阵或格式化数据集
y是类别变量,是一个矩阵,class.ind处理后生成的类指标矩阵
size代表的是隐藏层的节点个数,参数值为0时为无隐藏层的模型
rang初始随机权重的范围[-rang,rang],通常情况下,
decay是指模型建立过程中模型权重的衰减精度,即模型的衰减值小于该参数时,不再迭代。默认值为0
maxit控制的是模型的最大迭代次数
nnet的输出结果
wts,包含了在模型迭代过程中所寻找到的最优权重值,也可以理解为模型的最优系数。
residuals,包含了训练集的残差值。
convergence表示在建立的迭代过程中,迭代次数是否达到最大迭代数,1表示最大,0表示没有达到。
nnetHess()函数模型中的黑塞矩阵(即二次导数矩阵)
nnetHess(net, x, y, weights)
net即模型,x和y分别是自变量和相应变量。weights同nnet()中一样

library(nnet)
wine=read.table("C:\\Users\\Administrator\\Desktop\\数据分析\\winequality-white.txt",header=T,sep=";",na.strings="null")
cha=0#使用随机森林中已标定品质的白酒数据
for(i in 1:4898)
{ 
  if(wine[i,12]>6)cha[i]="good"
  else if(wine[i,12]>5)cha[i]="mid"
  else cha[i]="bad"
}  
wine[,12]=factor(cha)
scale01=function(x)
{
ncol=dim(x)[2]-1#提取特征变量个数
nrow=dim(x)[1]#提取样本集中的样本总量
new=matrix(0,nrow,ncol)#建立用于保存新样本集的矩阵
for(i in 1:ncol)
{
  max=max(x[,i])#提取每个变量的最大值
  min=min(x[,i])#提取每个变量的最小值
  for (j in 1:nrow)
{
  new[j,i]=(x[j,i]-min)/(max-min)#计算归一化后的新数据集
}
}
new
}
set.seed(71)
samp=sample(1:4898,3000)
wine[samp,1:11]=scale01(wine[samp,])#对样本进行预处理
r=1/max(abs(wine[samp,1:11]))#确定参数rang的变化范围
set.seed(101)
model1=nnet(quality~.,data=wine,subest=samp,size=4,rang=r,decay=5e-4,maxit=200)#建立神经网络模型
x=subset(wine,select=-quality)#提取wine数据集中除quality列以外的数据作为自变量
y=wine[,12]#提取quality列数据作为响应变量
y=class.ind(y)#预处理将其变为类指标矩阵
set.seed(101)
model2=nnet(x,y,decay=5e-4,maxit=200,size=4,rang=r)#建立神经网络模型
x=wine[,1:11]
?predict
pred=predict(model1,x,type="class")#根据模型对x数据进行预测
pred[sample(1:4898,8)]
xt=wine[,1:11]
pred=predict(model2,xt)#根据模型对xt数据进行预测
dim(pred)
pred[sample(1:4898,4),]
name=c("bad","good","mid")
prednew=max.col(pred)#确定每行中最大值所在的列
prednewn=name[prednew]#根据预测结果将其变为相对应的类别名称
set.seed(201)
prednewn[sample(1:4898,8)]
true=max.col(y)#确定真实值的每行中最大值所在的列
table(true,prednewn)#模型预测精度展示
set.seed(444)
nrow.wine=dim(wine)[1]
samp=sample(1:nrow.wine,nrow.wine*0.7)#抽取70%样本
wine[samp,1:11]=scale01(wine[samp,])#对数据样本进行预处理
wine[-samp,1:11]=scale01(wine[-samp,])#对测试集进行预处理
r=1/max(abs(wine[samp,1:11]))#确定rang的变化范围
n=length(samp)
err1=0
err2=0
for(i in 1:17)
{
  set.seed(111)
  model=nnet(quality~.,data=wine,maxit=400,rang=r,size=i,subset=samp,decay=5e-4)
  err1[i]=sum(predict(model,wine[samp,1:11],type='class')!=wine[samp,12])/n
  err2[i]=sum(predict(model,wine[-samp,1:11],type='class')!=wine[-samp,12])/(nrow.wine-n)
}  #运行时间较长,
plot(1:17,err1,"l",col=1,lty=1,ylab="1",xlab="2",ylim=c(min(min(err1),min(err2)),max(max(err1),max(err2))))
lines(1:17,err2,col=1,lty=3)
points(1:17,err1,col=1,pch="+")
points(1:17,err2,col=1,pch="o")
legend(1,0.53,"ce",bty="n",cex=1.5)
legend(1,0.35,"ce",bty="n",cex=1.5)
err11=0
err12=0
for(i in 1:500)
{
  set.seed(111)
  model=nnet(quality~.,data=wine,maxit=i,rang=r,size=3,subset=samp)
  err1[i]=sum(predict(model,wine[samp,1:11],type='class')!=wine[samp,12])/n
  err2[i]=sum(predict(model,wine[-samp,1:11],type='class')!=wine[-samp,12])/(nrow.wine-n)
}  
plot(1:length(err11),err11,'l',ylab ="1",xlab ="2",col=1,ylim=c(min(min(err11),min(err12)),max(max(err11),max(err12))))
lines(1:length(err11),err12,col=1,lty=3)
legend(250,0.47,"ce",bty="n",cex=1.2)
legend(250,0.425,"ce",bty="n",cex=1.2)
set.seed(111)
model=nnet(quality~.,data=wine,maxit=300,rang=r,size=3,subset = samp)
x=wine[-samp,1:11]#确认需要进行预测的样本的特征矩阵
pred=predict(model,x,tepe="class")#预测
table(wine[-samp,12,pred])

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值