| 介紹定義  在模式識(shí)別領(lǐng)域中,最近鄰居法(k-Nearest Neighbors algorithm,KNN算法,又譯K-近鄰算法)是一種用于分類和回歸的非參數(shù)統(tǒng)計(jì)方法。 起源  TODO 優(yōu)點(diǎn)
簡單,易于理解,易于實(shí)現(xiàn),無需估計(jì)參數(shù),無需訓(xùn)練;適合對稀有事件進(jìn)行分類;特別適合于多分類問題(multi-modal,對象具有多個(gè)類別標(biāo)簽)。 缺點(diǎn)
主要的不足:當(dāng)樣本不平衡時(shí),如一個(gè)類的樣本容量很大,而其他類樣本容量很小時(shí),有可能導(dǎo)致當(dāng)輸入一個(gè)新樣本時(shí),該樣本的K個(gè)鄰居中大容量類的樣本占多數(shù)。 該算法只計(jì)算“最近的”鄰居樣本,某一類的樣本數(shù)量很大,那么或者這類樣本并不接近目標(biāo)樣本,或者這類樣本很靠近目標(biāo)樣本。無論怎樣,數(shù)量并不能影響運(yùn)行結(jié)果。計(jì)算量較大,因?yàn)閷γ恳粋€(gè)待分類的文本都要計(jì)算它到全體已知樣本的距離,才能求得它的K個(gè)最近鄰點(diǎn)。可理解性差,無法給出像決策樹那樣的規(guī)則。 應(yīng)用領(lǐng)域  文本分類,聚類分析,數(shù)據(jù)挖掘,機(jī)器學(xué)習(xí),預(yù)測分析,減少維度,模式識(shí)別,圖像處理 相關(guān)  然而k最近鄰居法因?yàn)橛?jì)算量相當(dāng)?shù)拇?,所以相?dāng)?shù)暮臅r(shí),Ko與Seo提出一算法TCFP(text categorization using feature projection),嘗試?yán)锰卣魍队胺▉斫档团c分類無關(guān)的特征對于系統(tǒng)的影響,并借此提升系統(tǒng)效能,其實(shí)實(shí)驗(yàn)結(jié)果顯示其分類效果與k最近鄰居法相近,但其運(yùn)算所需時(shí)間僅需k最近鄰居法運(yùn)算時(shí)間的五十分之一。 除了針對文件分類的效率,尚有研究針對如何促進(jìn)k最近鄰居法在文件分類方面的效果,如Han等人于2002年嘗試?yán)秘澬姆?,針對文件分類?shí)做可調(diào)整權(quán)重的k最近鄰居法WAkNN(weighted adjusted k nearest neighbor),以促進(jìn)分類效果;而Li等人于2004年提出由于不同分類的文件本身有數(shù)量上有差異,因此也應(yīng)該依照訓(xùn)練集合中各種分類的文件數(shù)量,選取不同數(shù)目的最近鄰居,來參與分類。
 解法實(shí)現(xiàn)Python
Scikit-Learn http:///stable/modules/neighbors.html
 KNN分類器使用sklearn.neighbors.KNeighborsClassifier,參數(shù)設(shè)置參考 http:///stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html knn_classification_example.py 
 python X = [[0, 100], [1, 99], [99, 1], [100, 0]]
 y = [0, 0, 1, 1]
 from sklearn.neighbors import KNeighborsClassifier
 classifier = KNeighborsClassifier(n_neighbors=3)
 classifier.fit(X, y)
 print(classifier.predict([[10, 90], [90, 10]]))
 print(classifier.predict_proba([[10, 90], [90, 10]]))
 print(classifier.kneighbors([[10, 90], [90, 10]], return_distance=False))
 
 output 
 text >>> print(classifier.predict([[10, 90], [90, 10]]))
 [0 1]
 >>> print(classifier.predict_proba([[10, 90], [90, 10]]))
 [[ 0.66666667  0.33333333]
 [ 0.33333333  0.66666667]]
 >>> print(classifier.kneighbors([[10, 90], [90, 10]], return_distance=False))
 [[1 0 2]
 [2 3 1]]
 
 KNN回歸器使用sklearn.neighbors.KNeighborsRegressor,參數(shù)設(shè)置參考 http:///stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html knn_regression_example.py 
 python X = [[0], [1], [2], [3]]
 y = [0, 0, 1, 1]
 from sklearn.neighbors import KNeighborsRegressor
 regressor = KNeighborsRegressor(n_neighbors=2)
 regressor.fit(X, y)
 print(regressor.predict([[1.5]]))
 
 應(yīng)用  TODO 參考
https://zh./wiki/最近鄰居法http://baike.baidu.com/view/1485833.htmhttp://blog.sina.com.cn/s/blog_7fc305440101d0vr.html |