摘要:
1.算法概述
2.算法推導
3.算法特性及優缺點
4.注意事項
5.實現和具體例子
6.適用場合
內容:
1.算法概述
K近鄰算法是一種基本分類和回歸方法;分類時,根據其K個最近鄰的訓練實例的類別,通過多數表決等方式進行預測;k近鄰法實際上利用訓練數據集對特征向量空間進行划分,並作為其分類的"模型"(Cover和Hart 在1968)--參考自《統計學習方法》
回歸是根據k個最近鄰預測值計算的平均值--參考自scikit-learn官網
2.算法推導
2.1 kNN三要素
k值的選擇:當k值較小時,預測結果對近鄰的實例點非常敏感,容易發生過擬合;如果k值過大模型會傾向大類,容易欠擬合;通常k是不大於20的整數(參考《機器學習實戰》)
距離度量:不同距離度量所確定的最近鄰點是不同的
分類決策規則:多數表決(majority voting)規則是在損失函數是0-1損失函數時的經驗風險最小化
2.2 KD樹:解決對k近鄰進行快速搜索的一種二叉樹,構造kd樹相當於不斷用垂直於坐標軸的超平面對特征空間進行划分,最終構成一系列的K維超矩陣區域;每一個節點對應於一個k維超矩形區域。一般情況下順序選擇坐標軸及坐標軸的中位數(下圖中取的最中間兩個數較大的一個數)進行切分。kd樹是平衡的但效率未必最優--參考自《統計學習方法》
KD樹只在小於等於20維的數據集上可以快速搜索,但是當維數增長時效率降低
如下圖對T = {(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}建立kd樹的結果:
2.3 ball tree:解決高維空間下kd樹失效的一種樹形結構;Ball樹根據質心C和半徑r對數據進行遞歸的划分,每一個數據點都會被划分到一個特定的質心C和半徑r的的超球體里面,在搜索的時候,候選的點會使用|x+y| <= |x| + |y|進行篩選(papers:“Five balltree construction algorithms”)
如下圖是顯示了一個2維平面包含16個觀測實例的圖(參考自):
3.算法特性及優缺點
優點:精度高,對異常值不敏感
缺點:k值敏感,空間復雜度高(需要保存全部數據),時間復雜度高(平均O(logM),M是訓練集樣本數)
4.注意事項
歸一化:基於距離的函數,要進行歸一化;否則可能造成距離計算失效
5.實現和具體例子
構建KD樹並使用KD樹進行最近鄰搜索(《統計學習方法》算法3.2和3.3)
機器學習實戰中的提高約會網站配對指數和手寫識別的例子(numpy實現,未使用KD樹)
scikit-learn使用KNN進行分類的例子(分類決策上可以加大鄰近點的權重);
ball tree 實現的例子(有時間研究下)
6.適用場合
是否支持大規模數據:單機下時間和空間消耗大,不過可以通過分布式解決(github上找到的一個spark knn實現,有時間研究下)
特征維度
是否有 Online 算法:有
特征處理:支持數值型數據,類別型類型需要進行0-1編碼