k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
KNN的核心思想是:找出特徵空間中距離待分類點最近的k個點,如果這k個點大多數屬於某一個類別,則該樣本也屬於這個類別。
k值一般取20以下的整數。下圖為從網上截取的圖片,可以直觀看到與點x最臨近的5個點裡,有4個為紅色圓點,因此將點x的類別判斷為紅色圓點一類。
在R中實現knn聚類,可以使用class包中點knn()函數。在下面的例子中,我們使用UCI的[乳腺癌特徵數據集]進行演示。首先,讀入網上的數據:
#讀取網上的數據並設置變量名
url <- 'http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/wdbc.data'
wdbc.data <- read.csv(url,header = F)
names(wdbc.data) <- c('ID','Diagnosis','radius_mean','texture_mean','perimeter_mean', 'area_mean','smoothness_mean','compactness_mean','concavity_mean',
'concave points_mean','symmetry_mean','fractal dimension_mean','radius_sd','texture_sd','perimeter_sd','area_sd','smoothness_sd','compactness_sd','concavity_sd','concave points_sd','symmetry_sd','fractal dimension_sd','radius_max_mean','texture_max_mean','perimeter_max_mean','area_max_mean','smoothness_max_mean','compactness_max_mean','concavity_max_mean','concavepoints_max_mean','symmetry_max_mean','fractal dimension_max_mean')
因為有的變量取值大,有的變量取值小,所以我們在使用knn進行分類前,要先對數據通過歸一化來進行無量綱處理。
#編寫歸一化函數
normalize <- function(x)
{
return ((x-min(x))/(max(x)-min(x)))
}
#對數據進行歸一化
wdbc.data.min_max <- as.data.frame(lapply(wdbc.data[3:length(wdbc.data)],normalize))
wdbc.data.min_max$Diagnosis <- wdbc.data$Diagnosis
區分訓練集和測試集,並紀錄相應的分類標籤。
m<-(dim(wdbc.data.min_max))[1]
val<-sample(1:m,size=round(m/3),replace=FALSE,prob=rep(1/m,m))
data.train<-wdbc.data.min_max[-val,]
data.test<-wdbc.data.min_max[val,]
data.train.label<-data.train$Diagnosis
data.test.label<-data.test$Diagnosis
data.train<-wdbc.data.min_max[-val,- length(wdbc.data.min_max)]
data.test<-wdbc.data.min_max[val,- length(wdbc.data.min_max)]
用knn算法進行分類,並用實際的分類標籤與預測出的分類結果進行效果檢測。
library(class)
test.pre.labels <- knn(data.train,data.test,data.train.label,k=7)
library(gmodels)
CrossTable(x = data.test.label, y = test.pre.labels, prop.chisq = F)
檢測結果為:
選取兩個變量作為橫縱坐標進行畫圖,觀察實際類別與預測的分類結果。
plot(data.test$texture_mean,data.test$radius_mean,col=test.pre.labels,pch=as.integer(data.test.label))
顏色代表分類後得到的結果,形狀代表真實的類別。從檢測結果和圖上都可以看出,分類結果基本與真實結果一致。
優點:
(1)算法原理簡單,無需估計參數和訓練。
(2)適合稀有事件的分類問題。
缺點:
(1)計算量太大,需要計算與每個點的距離。
(2)可解釋性不強。
(3)樣本不平衡時,k個最近的點中,大容量類別的點佔據了大多數,但大容量類別不一定為待分類點的真實類別。
本公眾號其他聚類篇文章:
聚類(一):DBSCAN算法實現(r語言)
聚類(二):k-means算法(R&python)
機器學習養成記
搜索添加微信公眾號:chenchenwings
長按圖片,識別二維碼,關注我們。
如需轉載,請在開篇顯著位置註明作者和出處,並在文末放置機器學習養成記二維碼和添加原文連結。
快來關注我們吧!