上著上著,突然發現上輩子的回憶飄出來了。KNN 是空間統計中相當常見的一種方法,在判斷事件點是否存在空間上的群聚時也經常使用。透過 KNN,可以根據資料點之間的鄰近程度進行分類,進一步判斷某個事件點的空間分布是否可以歸入某個群聚。
KNN 又稱為 K-Nearest Neighbors(K 個最近鄰居),它的概念很直觀:針對一個新的資料點,先找出距離它最近的 K 個資料點,再根據這些鄰近資料點的分類進行判斷。例如,如果附近的資料點多數屬於 A 類,就將新的資料點分類為 A 類。
至於要找多少個「鄰居」才算合理,就取決於模型設定的 K 值。K 越大,參考的鄰居越多;K 越小,則會更依賴距離較近的少數資料點。
詳細步驟拆分說明
0.資料已經有預先設定好的分類
KNN 是監督式學習,因此訓練資料本身已經有分類好的結果(Label)。我們不是利用 KNN 重新建立分類,而是利用這些已知分類的資料,來判斷新的資料點應該屬於哪一類。
1. 先決定 K 值
首先要決定要參考幾個鄰居,也就是 K 要設定為多少,例如 K = 1、3、5 等。K 值沒有固定的最佳答案,需要根據資料與模型的表現來選擇,
2. 計算距離,找出最近的 K 個資料點
接著,計算新資料點與其他資料點之間的距離,找出距離最近的 K 個資料點。最常見的一種方法是歐基里德距離(Euclidean distance)。簡單來說,可以把「距離」理解成資料點之間的差距。除了歐基里德距離,也可以使用其他距離計算方式,例如 曼哈頓距離(Manhattan distance)。
這兩種距離可以用直角三角形來幫助理解:
3. 查看這 K 個鄰居分別屬於哪一類
找到最近的 5 個資料點之後,再查看這些鄰居原本分別屬於哪一個分類。假設找到的 5 個鄰居中:
3 個屬於 A 類,2 個屬於 B 類,根據多數決進行分類。因此新的資料點 X 就會被分類為 A 類。
簡單來說,KNN 的核心概念就是:
先找到離新資料點最近的 K 個鄰居,再看看這些鄰居大多屬於哪一類,最後就把新資料點歸到那一類。
實作
蠻簡單的,資料的處理跟logistic regression相同,開始不一樣的地方是用 sklearn.neighbors的KNeighborsClassifier
附上官方給的sample
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier --匯入函式庫
neigh = KNeighborsClassifier(n_neighbors=3) --宣告模型跟k值
neigh.fit(X, y) --代入資料訓練模型
print(neigh.predict([[1.1]]))
--接著匯入資料,用predict方法看結果,但講師資料需要另作feature scaling的處理
print(neigh.predict_proba([[0.9]]))
--還可以看predict出來結果對應的機率,會得到各分類的機率,可能為多個值,若用講師資料一樣要feature scaling
最後也是可以用混淆矩陣看及accuracy score評估訓練模型的適切度(跟Day11 說到的logistics regression評估方法相同)