分类
class.ind=function(cl) #输入cl是一个表示分类结果的向量
{
n=length(cl)
cl=as.factor(cl) #cl转化为因子型
x=matrix(0,n,length(levels(cl))) #生成一个大小为样本数乘以类别数的值为0的矩阵
x[(1:n)+n*(unclass(cl)-1)]=1 #把对应样本行以及样本类别列的元素设置为1
dimnames(x)=list(names(cl),levels(cl)) #设置每一列的名称
x
}
将数据统一转化为0~1的实数值
#设置自己的规范化函数
normalize=function(x)
{
num=x-min(x)
denom=max(x)-min(x)
return(num/denom)
}
规范化数据集
iris_norm=as.data.frame(lapply(iris[1:4],normalize))
head(iris_norm) #查看规范化后的数据
按照70%和30%随机划分训练集和测试集
set.seed(2019)
index=sample(nrow(iris),nrow(iris)*0.7)
iristrain=iris_norm[index,] #训练集
iristest=iris_norm[-index] #测试集
#调用class.ind函数把鸢尾花品种转换为二值矩阵的形式,再与花瓣、花萼数据组成新的测试数据集
iristrain.label=iris[index,5]
iristest.label=iris[-index,5]
target=class.ind(iristrain.label)
iris.train=cbind(iristrain,target)
#采用三层感知器作为模型,输入层是四个长宽测量值,隐层中使用四个神经元,输出层则是三个品种对应的输出值
#训练集的目标输出值只有正确的品种分类对应的数值是1,其他则输出为0.
设置神经网络模型
install.packages("neuralnet")
library(neuralnet)
net.iris=neuralnet(
setosa+versicolor+virginica~Sepal.Length+Sepal.Width+Petal.Length+Petal.Width, #输入输出关系公式
data = iris.train, #训练集
hidden=4 #1个隐层含有4个神经元
)
plot(net.iris) #画出神经网络图
得到网络中训练集的输出
train.outputs=as.data.frame(net.iris$net.result)
得到每行中最大值所在列
cid=apply(train.outputs,1,which.max)
使用品种名替换最大值
results=c("setosa","versicolor","virginica")[cid]
使用混淆矩阵判断结果,只有一例预测错误
table(results,iristrain.label)
iristrain.label
results | setosa | versicolo | virginica |
setosa | 37 | 0 | 0 |
versicolor | 0 | 32 | 0 |
virginica | 0 | 1 | 35 |