1 K最近邻
这部分即将要讨论的K最近邻和后面的有权重K最近邻算法在R中的实现,其核心函数 knn()与 kknn()集判别规则的“建立”和“预测”这两个步骤于一体,即不需在规则建立后再使用predict()函数来进行预测,可由knn()和 kknn()一步实现。
按照次序向knn()函数中依次放入训练集中各属性变量(除第12个变量nmkat)、测试集(除第12个变量 nmkat)、训练集中的判别变量(第12个变量nmkat),并首先取K的默认值1进行判别。
fitpreknn<-knn(datatrain[,-12],datatest[,-12],c1<-datatrain[,12])
fitpreknn
table(datatest$nmkat,fitpreknn) #混淆矩阵,行为真实值,列为预测值
结果分析:由混淆矩阵我们看到,nmkat 的5个类别分别有55、46、37、44、61个样本被正确分类,第5类被正确分类的样本最多。
K最近邻算法也有其缺陷,当样本不平衡,即某些类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个最近邻样本中大容量类别的样本占多数。在这种情况下就可以使有权重的K最近邻算法来改进。
2 有权重的K最近邻算法
这部分我们使用kknn()函数来实现有权重的K最近邻算法,同时将训练集与测试集一起放入函数,但格式上略有不同,需注意kknn是公式formula格式的函数。
library(kknn)
fitprekknn<-kknn(nmkat~.,train<-datatrain,test<-datatest[,-12],k=5)
summary(fitprekknn)
结果分析:我们可以看到测试集中每一个样本归属于各类别的概率,依次记于 prob.1至prob.5,其中,fit记录了该样本最终被判定的类别。
下面我们使用fitted(函数来得到预测结果,即如上输出结果中的fit:
fit<-fitted(fitprekknn) #输出有权重的K最邻近预测结果
fit
table(datatest$nmkat,fit) #生成混淆军阵,行为实际,列为预测