判別分析--KNN、有權重的K最鄰近算法


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個類別分別有5546374461個樣本被正確分類,第5類被正確分類的樣本最多。

K最近鄰算法也有其缺陷,當樣本不平衡,即某些類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個最近鄰樣本中大容量類別的樣本占多數。在這種情況下就可以使有權重的K最近鄰算法來改進。

有權重的K最近鄰算法

這部分我們使用kknn()函數來實現有權重的K最近鄰算法,同時將訓練集與測試集一起放入函數,但格式上略有不同,需注意kknn是公式formula格式的函數。

library(kknn)

fitprekknn<-kknn(nmkat~.,train<-datatrain,test<-datatest[,-12],k=5)

summary(fitprekknn)

 

結果分析:我們可以看到測試集中每一個樣本歸屬於各類別的概率,依次記於 prob.1prob.5,其中,fit記錄了該樣本最終被判定的類別。

下面我們使用fitted(函數來得到預測結果,即如上輸出結果中的fit

fit<-fitted(fitprekknn)   #輸出有權重的K最鄰近預測結果

fit

 

table(datatest$nmkat,fit)    #生成混淆軍陣,行為實際,列為預測

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM