KNN的工作原理
1.計算待分類物體與其他物體之間的距離抱婉;
2.統(tǒng)計距離最近的K個鄰居;
3.對于K個最近的鄰居容握,他們屬于哪個分類多嚼沿,待分類物體就屬于哪一類估盘。
(注:K值的具體大小一般根據(jù)交叉驗證的方式得出)
距離如何計算
兩個樣本點之間的距離代表了這兩個樣本之間的相似度。距離越大骡尽,差異性越大遣妥。距離越小则奥,相似度越大搔课。
關(guān)于距離的計算方式,一般有下面五種方式:
1. 歐氏距離币旧;
2. 曼哈頓距離辨图;
3.閔可夫斯基距離班套;
4.切比雪夫距離;
5.余弦距離
其中故河,前三種最為常用吱韭。
歐氏距離是我們最常用的距離公式,兩點之間的歐式距離為:
同理鱼的,兩點在n維空間中的距離:
曼哈頓距離在幾何空間中用的比較多理盆,它等于兩個點在坐標(biāo)系上絕對軸距總和。
閔可夫斯基距離不是一個距離凑阶,而是一組距離的定義猿规。對于 n 維空間中的兩個點x(x1,x2,…,xn) 和 y(y1,y2,…,yn),x和y兩點之間的閔可夫斯基距離為:
其中p代表空間的維數(shù)宙橱,當(dāng)p=1時姨俩,就是曼哈頓距離;當(dāng)p=2時师郑,就是歐式距離环葵;當(dāng)時,就是切比雪夫距離宝冕。
余弦距離實際上計算的是兩個向量的夾角张遭,是在方向上計算兩者之間的差異,對絕對數(shù)值不敏感地梨。在興趣相關(guān)性比較上菊卷,角度關(guān)系比距離的絕對值更重要,因此余弦距離可以用于衡量用戶對內(nèi)容興趣的區(qū)分度湿刽。比如我們用搜索引擎搜索某個關(guān)鍵詞的烁,它還會給你推薦其他的相關(guān)搜索,這些推薦的關(guān)鍵詞就是采用余弦距離計算得出的诈闺。
為了減少計算距離次數(shù)渴庆,提升 KNN 的搜索效率,人們提出了KD樹(K-Dimensional 的縮寫)。KD樹是對數(shù)據(jù)點在K維空間中劃分的一種數(shù)據(jù)結(jié)構(gòu)襟雷。在KD樹的構(gòu)造中刃滓,每個節(jié)點都是K維數(shù)值點的二叉樹。既然是二叉樹耸弄,就可以采用二叉樹的增刪改查操作咧虎,這樣就大大提升了搜索效率。
用KNN做回歸
對于一個新點计呈,我們需要找出這個點的K個最近鄰居砰诵,然后將這些鄰居的屬性的平均值賦給該點,就可以得到該點的屬性捌显。
在sklearn中使用KNN
可用如下語句引入KNN分類器:
from sklearn.neighbors import KNeighborsClassifier
KNeighborsClassifier有如下幾個參數(shù)
1.n_neighbors:即 KNN 中的 K 值茁彭,代表的是鄰居數(shù)量。K值太小會造成過擬合扶歪,K值太大會造成無法準(zhǔn)確分類理肺。
2.weights:用來確定鄰居的權(quán)重,uniform表示所有權(quán)重相同善镰,distance代表權(quán)重是距離的倒數(shù)妹萨。
3.algorithm:用來規(guī)定鄰居的計算方法,auto會根據(jù)情況自動選擇炫欺。kd_tree表示KD樹乎完,一般用于維數(shù)不超過20的情況。ball_tree品洛,也叫作球樹囱怕,它和 KD 樹一樣都是多維空間的數(shù)據(jù)結(jié)果,不同于 KD 樹毫别,球樹更適用于維度大的情況;brute典格,也叫作暴力搜索岛宦。
4.leaf_size:代表構(gòu)造 KD 樹或球樹時的葉子數(shù),默認(rèn)是 30耍缴,調(diào)整 leaf_size 會影響到樹的構(gòu)造和搜索速度砾肺。
KNN算法和距離定義相關(guān),通常使用Z-Score規(guī)范化對數(shù)據(jù)進(jìn)行規(guī)范化處理防嗡。