R中的knn算法實現(xiàn)

偶然之間看到崎淳,很多R包中都有knn算法的應(yīng)用,他們有什么不同之處嗎巧勤?到底應(yīng)該選擇哪個包來實現(xiàn)knn呢?
為了解決這些疑惑旅挤,我對class包踢关、DMwR包和kknn包中的knn實現(xiàn)做了一個初步整理,結(jié)果如下(算法的原理粘茄、流程签舞、優(yōu)缺點(diǎn)就不寫了,很多現(xiàn)成的資料)柒瓣。

1.說明

以下涉及到的數(shù)據(jù)來自R中的鳶尾花數(shù)據(jù)集iris儒搭,根據(jù)花的種類平均分為訓(xùn)練集和測試集。

2.R包中的knn實現(xiàn)

R中有許多包都可以實現(xiàn)knn算法芙贫,以下以class包搂鲫、DMwR包和kknn包為例進(jìn)行說明。

2.1 class包中的knn

knn()函數(shù)的語法和參數(shù)如下:
knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)
train:指定訓(xùn)練樣本集
test :指定測試樣本集
cl :指定訓(xùn)練樣本集中的分類變量
k :指定最鄰近的k個已知分類樣本點(diǎn)磺平,默認(rèn)為1
l :指定待判樣本點(diǎn)屬于某類的最少已知分類樣本數(shù)魂仍,默認(rèn)為0
prob:設(shè)為TRUE時,可以得到待判樣本點(diǎn)屬于某類的概率拣挪,默認(rèn)為FALSE
use.all:控制節(jié)點(diǎn)的處理辦法擦酌,即如果有多個第K近的點(diǎn)與待判樣本點(diǎn)的距離相等,默認(rèn)情況下將這些點(diǎn)都納入判別樣本點(diǎn)菠劝,當(dāng)該參數(shù)設(shè)為FALSE時赊舶,則隨機(jī)挑選一個樣本點(diǎn)作為第K近的判別點(diǎn)

實現(xiàn)代碼:

> # z-score數(shù)據(jù)標(biāo)準(zhǔn)化
> iris_scale <- scale(iris[-5]) 
> train <- iris_scale[c(1:25,50:75,100:125),] #訓(xùn)練集
> test <- iris_scale[c(26:49,76:99,126:150),] #測試集
> train_lab <- iris[c(1:25,50:75,100:125),5]
> test_lab <- iris[c(26:49,76:99,126:150),5]
> pre <- knn(train=train,test=test,cl=train_lab,k=round(sqrt(dim(train)[1])),prob = F)  
> table(pre,test_lab)
            test_lab
pre          setosa versicolor virginica
  setosa         24          0         0
  versicolor      0         24         3
  virginica       0          0        22

2.2 DMwR包中的KNN

KNN()函數(shù)的語法和參數(shù)如下:
kNN(form, train, test, norm = T, norm.stats = NULL, ...)
form:分類模型
train:指定訓(xùn)練樣本集
test:指定測試樣本集
norm:布爾值,指示是否在KNN預(yù)測前將數(shù)據(jù)標(biāo)準(zhǔn)化赶诊,默認(rèn)為TRUE
norm.stats:默認(rèn)FALSE笼平,采用scale()進(jìn)行標(biāo)準(zhǔn)化,也可提供其他標(biāo)準(zhǔn)化方法(不太懂)

實現(xiàn)代碼:

> train<-iris[c(1:25,50:75,100:125),] #訓(xùn)練集
> test<-iris[c(26:49,76:99,126:150),] #測試集
> pre2 <- kNN(Species~.,train,test,norm=T,k=round(sqrt(dim(train)[1])))
> table(pre2,test$Species)
            
pre2         setosa versicolor virginica
  setosa         24          0         0
  versicolor      0         24         3
  virginica       0          0        22

2.3 kknn包中的kknn

kknn()函數(shù)的語法和參數(shù)如下:
kknn(formula = formula(train),train, test, na.action = na.omit(), k= 7, distance = 2, kernel = "optimal", ykernel = NULL, scale=TRUE, contrasts= c('unordered' = "contr.dummy", ordered ="contr.ordinal"))
formula一個回歸模型:分類變量~特征變量舔痪;
train指定訓(xùn)練樣本集寓调;
test指定測試樣本集;
na.action缺失值處理锄码,默認(rèn)為去掉缺失值捶牢;
k近鄰數(shù)值選擇,默認(rèn)為7巍耗;
distance閔可夫斯基距離參數(shù)秋麸,p=2時為歐氏距離;
其他參數(shù)略

實現(xiàn)代碼:

> train<-iris[c(1:25,50:75,100:125),] #訓(xùn)練集
> test<-iris[c(26:49,76:99,126:150),] #測試集
> # 調(diào)用kknn
> pre3 <- kknn(Species~., train, test, distance = 1, kernel = "triangular")
> # 獲取fitted.values
> fit <- fitted(pre3)  
> table(fit,test$Species)
            
fit          setosa versicolor virginica
  setosa         24          0         0
  versicolor      0         22         4
  virginica       0          2        21

3.knn算法中K值的確定

參考分類算法之knn

knn為k近鄰算法炬太,需要解決的一個問題是選擇合適的k值灸蟆,k值過小或過大都會影響模型的準(zhǔn)確性,一般考慮將k值設(shè)為3~10,或是將k值設(shè)為訓(xùn)練集樣本數(shù)量的平方根炒考。還有一種選擇k值的方法是結(jié)合訓(xùn)練集和測試集可缚,循環(huán)k值,直到挑選出使測試集的誤差率最小的k值斋枢。

以class包knn舉例說明帘靡,尋找誤差率最低的K值:

> for(i in 1:round(sqrt(dim(train)[1]))) {
+   pre_result <- knn(train=train,test=test,cl=train_lab,k=i)
+   Freq <- table(pre_result,test_lab)
+   print(1-sum(diag(Freq))/sum(Freq)) #誤差率
+ }
[1] 0.08219178
[1] 0.06849315
[1] 0.08219178
[1] 0.06849315
[1] 0.05479452
[1] 0.06849315
[1] 0.05479452
[1] 0.09589041
[1] 0.04109589

根據(jù)結(jié)果,k=9時誤差率最低瓤帚,和訓(xùn)練集樣本數(shù)量的平方根一致描姚。但是如果樣本數(shù)量過大,以上的K值確定方法就比較困難了戈次,也正驗證了knn不適合大樣本數(shù)據(jù)的說法轩勘。

4.總結(jié)

總體來看,我認(rèn)為三種實現(xiàn)knn的函數(shù)區(qū)別不大怯邪,只在參數(shù)上有一些差別绊寻,可以根據(jù)個人喜好選擇實現(xiàn)knn的函數(shù)。
需要注意的點(diǎn):
數(shù)據(jù)標(biāo)準(zhǔn)化:knn()函數(shù)在調(diào)用前需標(biāo)準(zhǔn)化數(shù)據(jù)悬秉,其他2個函數(shù)默認(rèn)調(diào)用時進(jìn)行標(biāo)準(zhǔn)化澄步;
缺失值:k近鄰以距離為依據(jù),因此數(shù)據(jù)中不能含有缺失值和泌;
k值大写甯住:k過小,噪聲對分類的影響就會變得非常大允跑,K過大王凑,很容易誤分類搪柑;
距離計算:上面算法默認(rèn)歐式距離聋丝,如果有時間,可以看看不同距離計算方法的效果工碾。
補(bǔ)充的點(diǎn):
VIM包中也有KNN()函數(shù)弱睦,是用knn算法來填補(bǔ)缺失值;
DMwR包中的knnImputation也可以用來填補(bǔ)缺失值(均值渊额、均值權(quán)重)

參考:

分類算法之knn

KNN算法及R語言實現(xiàn) - CSDN博客

數(shù)學(xué)中的常見的距離公式 - CSDN博客

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末况木,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旬迹,更是在濱河造成了極大的恐慌火惊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奔垦,死亡現(xiàn)場離奇詭異屹耐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)椿猎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門惶岭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寿弱,“玉大人,你說我怎么就攤上這事按灶≈⒏铮” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵鸯旁,是天一觀的道長噪矛。 經(jīng)常有香客問我,道長羡亩,這世上最難降的妖魔是什么摩疑? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮畏铆,結(jié)果婚禮上雷袋,老公的妹妹穿的比我還像新娘。我一直安慰自己辞居,他們只是感情好楷怒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瓦灶,像睡著了一般鸠删。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贼陶,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天刃泡,我揣著相機(jī)與錄音,去河邊找鬼碉怔。 笑死烘贴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撮胧。 我是一名探鬼主播桨踪,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芹啥!你這毒婦竟也來了锻离?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤墓怀,失蹤者是張志新(化名)和其女友劉穎汽纠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傀履,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虱朵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卧秘。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡呢袱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翅敌,到底是詐尸還是另有隱情羞福,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布蚯涮,位于F島的核電站治专,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏遭顶。R本人自食惡果不足惜张峰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒旗。 院中可真熱鬧喘批,春花似錦、人聲如沸铣揉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逛拱。三九已至敌厘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朽合,已是汗流浹背俱两。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曹步,地道東北人宪彩。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像箭窜,于是被迫代替她去往敵國和親毯焕。 傳聞我的和親對象是個殘疾皇子衍腥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容