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) #生成混淆軍陣,行為實際,列為預測

