目錄
k近鄰的思想
距離怎麼算
k的取值
**規則
應用:kd樹
kd樹的構建
kd樹的搜尋
今天介紹的k近鄰演算法是一種思想非常簡單的分類回歸演算法。顧名思義,**結果肯定是和樣本最靠近的k個鄰居有很大的關係。不同於其他演算法,需要先訓練模型才可以進行**,k近鄰演算法直接選擇與我們要**的樣本點距離最近的k個樣本,然後用這個k個鄰居的標籤值根據一定的規則得出**結果。那麼問題來了:1. 距離怎麼算? 2. k的取值? 3. 確定**結果的規則是什麼呢?下面我們一一來解答一下這三個問題。
我們聽到過很多計算距離的方法:余弦距離、歐氏距離、曼哈頓距離、切比雪夫距離等等...我們經常用到的就是歐式距離了,在k近鄰演算法裡最常用的也是歐式距離
當k=1時,該演算法為最近鄰演算法,演算法會將新資料**為與和它距離最近的訓練資料一樣的標籤。通常k值是通過交叉驗證確定的。k值的選擇對**結果有什麼影響呢?
k值小的時候,對雜訊點敏感,演算法的近似誤差小,估計誤差大。近似誤差和估計誤差的理解大家可以參考知乎上喬木先生的答案
k值大的時候,演算法的近似誤差增大,估計誤差減小,因為演算法每次**的時候參考的樣本點比較多,雜訊的影響就會減小。
在分類問題中,**規則是多數表決,即樣本的k個鄰居中哪類樣本多,那就歸為哪一類
在回歸問題中,**規則是取平均,即對樣本的k個鄰居的標籤值取平均,作為**結果
k近鄰演算法如果用線性掃瞄的方法實現,演算法的時間複雜度為o(n);如果用樹形結構來儲存資料,就可以將演算法的時間複雜度優化到o(logn),這便是kd樹了。注意:這裡的k和k近鄰演算法裡的k含義不同,這裡的k是指資料維度。
kd樹是一種對k維空間中的例項點進行儲存以便對其進行快速檢索的樹形資料結構。下面分別介紹一下kd樹的構建和搜尋過程。
輸入:樣本集
(1) 構造根結構,根據第一維特徵的大小將所有樣本排序,以中位數為中心將樣本分為兩類,分別作為根節點的左右子樹;
(2) 對於左右子樹,分別選取第2、3...維特徵變按照中位數進行子樹的劃分,直至每個樣本空間僅有乙個樣本
輸入:輸出:樣本的類別
(1) 搜尋kd樹中包含x的葉子結點作為「當前最近點」計入k近鄰陣列中。具體步驟:從根節點開始,選擇kd樹當前層的劃分維度,如果x對應維度大於節點值,到右子節點;如果x小於當前節點值,到左節點;
(2) 遞迴的向上回退:
(a) 如果當前k近鄰陣列中的元素少於k個,將當前節點的父節點加入k近鄰陣列中;否則,判斷當前節點是否在k近鄰球內部,如果在,就用當前節點的父節點代替k近鄰陣列中與x距離最遠的樣本
(b) 如果當前k近鄰陣列中元素少於k個,將當前節點的兄弟節點加入k近鄰陣列;否則檢視兄弟節點所在的區域與k近鄰球是否相交,如果相交,在兄弟節點區域遞迴檢視是否有在k近鄰球內部的節點
(3) 回退到根節點時結束搜尋。用k近鄰陣列中的樣本規矩**規則得到x的**結果。
*注:k近鄰球是指:以x為球心,
統計學習方法 k 近鄰演算法
所謂k 近鄰 knn 是基本且簡單的分類與回歸方法,說的就是每個樣本的分類都可以用它最接近的k個鄰居來代表。1 對給定的訓練例項點和輸入例項點,首先確定輸入例項點的k個最近鄰訓練例項點,然後利用這k個訓練例項點的類的多數來 輸入例項點的類。2 k近鄰模型對應於基於訓練資料集對特徵空間的乙個劃分。k近...
統計學習方法 k近鄰法
k近鄰法 knn 是一種基本的分類與回歸方法 分類這種需求,滲透到我們生活的方方面面 分類演算法可以幫助我們完成這些繁瑣的操作,並根據我們的要求不斷修正分類結果。分類演算法其實蠻多的,這裡順著書本順序,詳細講解knn演算法,再與k means k means 演算法進行簡單對比。k近鄰法是這樣乙個過...
統計學習方法 K近鄰法
k近鄰演算法簡單 直觀給定乙個訓練資料集,對新的輸入例項,在訓練資料集中找到與該例項最鄰近的k個例項,這k個例項的多數屬於某個類,就把該輸入例項分為這個類.下面先敘述k近鄰演算法,然後再討論其細節。近鄰法的特殊情況 k 1情形,稱為最近鄰演算法.對於輸入的例項點 特徵向量 x xx,最近鄰法將訓練資...