k近鄰模型
基本思想
\(k\)近鄰演算法還是很直觀的,準確的來說它不是一種學習演算法,而是一種統計方法,不具備學習過程,一次性就可以給出結果。
其本質思想是將特徵空間劃分成一個個的單元(\(cell\)),其中每個\(cell\)的區域由距離該點比其他點更近的所有點定義,所有的\(cell\)組成了整特徵空間。
如上圖所示:
考慮樣本\(x_1\)構成的\(cell\),記作\(cell_{x_1}\)
- 對於\(x_2\),其距離\(x_3\)比\(x_1\)近,因此,\(x_2\)無法成為\(cell_{x_1}\)中的一員
- 對於\(x_3\),其距離\(x_2\)比\(x_1\)近,因此,\(x_3\)無法成為\(cell_{x_1}\)中的一員
- 對於\(x_4\),其距離\(x_2, x_3, x_5\)均比\(x_1\)近,因此,\(x_4\)無法成為\(cell_{x_1}\)的一員
- 對於\(x_5\),其距離\(x_2, x_3, x_4\)均比\(x_1\)近,因此,\(x_5\)無法成為\(cell_{x_1}\)的一員
因此,\(x_1\)組成的\(cell\)為空,即\(cell_{x_1}=\emptyset\)
再考慮樣本\(x_2\)構成的\(cell\),記作\(cell_{x_2}\)
- 對於\(x_1\),由於沒有任何一樣比\(x_2\)距離\(x_1\)更近,因此\(x_1\)成為其一員
- 對於\(x_3\),由於沒有任何一樣比\(x_3\)距離\(x_1\)更近,因此\(x_3\)成為其一員
- 對於\(x_4\),其距離\(x_3, x_5\)均比\(x_2\)近,因此,\(x_4\)無法成為其一員
- 對於\(x_5\),其距離\(x_3, x_4\)均比\(x_2\)近,因此,\(x_5\)無法成為其一員
因此,\(cell_{x_2}=\{x_1, x_3 \}\)
同理我們可以得到\(cell_{x_3} = \{x_2\}\),\(cell_{x_4} = \{x_5\}\),\(cell_{x_5} = \{x_4\}\)
這樣一來,有所有\(cell\)定義的區域就組成了整個空間,就可以透過每個\(cell\)構成的區域中的樣本來對新樣本進行預測。
上面只是理想中的方式,是一種輔助理解的辦法,存在諸多問題,比如區域不好定義,上面的示例中我們只是規定了一個\(cell\)所必須包含的元素,並沒有定義由這些元素構成的區域。
在實際中,我們往往直接使用與每個樣本\(x\)最近的\(k\)個樣本\(N_k(x)\)的類別對\(x\)的類別進行預測,比如下面的所屬表決規則。
\begin{equation}
y = \mathop{\arg\max}\limits_{c_j} \sum_{x_i \in N_k{x}} I(y_i=c_j), i=1,2,\cdots,N;j=1,2,\cdots,K
\end{equation}
其中\(N\)為全體樣本,\(K\)為所有類別數,而距離度量往往使用L1範數,當然其他距離也行,下面是三種常見的距離。
曼哈頓距離(L1範數):
\begin{equation}
L_1(x_i,x_j) = \sum_{l = 1}^{n}\vert x_i^{(l)} - x_j^{(l)}\vert
\end{equation}
三種距離在二維空間中的等距圖如下:
對於\(L_1\)(黑色),由於夾角\(\theta=\frac{\pi}{4}\),所以黑線上的點到原點的\(L1\)始終相等,由於橙色為半徑為1的圓,因此橙色上的點到原點的\(L_2\)均為半徑,紅色為邊長為2的正方形,其上的點到原點的\(L_\infty\)均為邊長的一半。(圖中指示錯誤\(L_3\)應改為\(L_\infty\))
kd樹
從上面的介紹可知,若想找去每個樣本的\(k\)個近鄰\(N_{x_k}\)則需要計算\(N\)次後再排序選出,那麼所有樣本計算的時間複雜度至少是\(N^2\)級別,顯然代價無法承受,因此需要一種能夠有效減少冗餘計算的方式。而\(kd\)樹就是其中一種,它包括建樹和查詢兩個過程。
平衡樹的建立
\(kd\)樹的建立過程比較簡單,主要遵從如下思想:
假設樣本為\(d\)維,首先取所有樣本在\(d=1\)維度上的值並排序,找到中位數(若為偶數則計算二者均值),取出中位數對應的樣本(若不存在則在其相鄰處隨機取一個)建立根結點,並對左右兩部分樣本進行遞迴進行上述操作\(d = (d + 1) \% d\)
示例:
有以下二維空間中的資料集,要求建立一個\(kd\)樹
首先讓所有樣本在\(d = 1\)維上進行從小到大的排序得到:
得到中位數\(=\frac{5 + 7}{2}=6\),但是樣本中不含這個樣本,因此需要在兩側附件隨機取1個構建根結點,機器學習課本中選擇7,這裡我們以5作為示例。
因此得到\(root_{T_{1}}=(5,4)\), \(T_{11}=\{(2,3), (4,7)\}\), \(T_{12}=\{(7,2), (8,1), (9,6)\}\)
繼續構建下一層\(d=2\)維上樣本
對於\(T_{11}\)在\(d=2\)上進行排序得到\(T_{211}=T_{11}\),計算中位數\(=\frac{3+7}{2}=5\),由於\(T_{211}\)中不存在第二維為5的樣本,因此隨機選1,這裡選\(root_{T_{211}}=(2,3)\),因此\(T_{2112}=\{(4,7)\}\)成為它的右子樹(同時也是右根,右葉結點),並且無左子樹。
對於\(T_{12}\)在\(d=2\)上進行排序得到\(T_{212}=\{(8,1),(7,2),(9,6)\}\),計算中位數\(=2\),因此得到\(root_{T_{212}}=(7,2)\), 左子樹(左根,左葉)\(T_{2121}=\{(8,1)\}\),右子樹(右根,右葉)\(T_{2122}=\{(9,6)\}\)。
至此,原始樣本的對應的平衡\(kd\)樹構建完畢。
下面是圖例:
樹的查詢
樹的查詢包括正向和反向兩個過程,正向和建樹類似只需一一判斷即可,反向也是必須的,因為正向過程不能保證所查詢到的一定是其最近鄰(需要參見\(kd\)樹原始論文)。
- 正向遞迴查詢。當給出一個樣本在查詢與它的最近鄰樣本時(限定\(L_2\)距離)時,需要依次從根節點往下查詢,和建樹過程類似,比如在建立第一層時用的是\(d=1\)即第一維值的大小,那麼查詢時也應使用樣本的第一維與其第一維進行比較,該過程遞迴進行直至找到葉子結點。
- 反向回溯查詢。在得到正向查詢中與樣本點\(x_i\)的近似最近鄰點\(x_j\)時,以\(x_i\)為圓心,\(x_i\)到\(x_j\)的\(L_2\)距離為半徑構建一個圓。回溯,依次各個區域是否與圓相交,若相交找到與其相交的最小區域對應的結點,
示例:
我們考慮比機器學習課本更復雜一些的情況,如下。
首先我們容易根據正向查到找到樣本點\(S\)所處的區域即B的右子樹對應的區域,也是葉結點\(D\)的範圍。構建以\(S\)為圓心,\(d_{SD}\)為半徑的圓。然後檢查\(F\)對應的區域是否與圓相交,顯然不相交,於是F向上回溯至A的上半部分\(C\)對應的區域,顯然與圓相交。於是檢查C的左區域\(G\)對應的區域,無相交,檢查\(C\)的右區域\(E\)是否相交,相交,更新半徑為\(d_{SE}\),並構建新圓,如下。
繼續檢查\(E\)的上區域\(H\)是否相交,相交,但是距離太遠不用更新,繼續檢查E的下區域\(I\)是否相交,明顯相交,且半徑可以更新為\(d_{IS}\),繼續這樣操作之後,還可以更新半徑為\(d_{KS}\)(圖沒畫好),最終的得到S的最近鄰點\(K\)。