K近鄰算法學習筆記
一、算法簡介
K近鄰算法(K - Nearest Neighbors,簡稱KNN)是一種簡單而有效的分類和回歸算法。它的核心思想是“近朱者赤,近墨者黑”,即一個數據點的類別或值可以通過其周圍最近的K個鄰居來判斷。KNN算法不需要復雜的模型訓練過程,而是直接基于數據點之間的距離來做出決策。
二、算法原理
- 距離度量
- 歐氏距離:最常用的距離度量方式,計算兩個點在各維度差值的平方和的平方根。例如,對于兩個點 (x) 和 (y),其歐氏距離為 (\sqrt{\sum_{i=1}^{n}(x_i - y_i)^2}),其中 (n) 是特征的維度。
- 曼哈頓距離:計算兩個點在各維度差值的絕對值之和,適用于網格狀數據。公式為 (\sum_{i=1}^{n}|x_i - y_i|)。
- 明可夫斯基距離:是歐氏距離和曼哈頓距離的推廣形式,公式為 (\left(\sum_{i=1}^{n}|x_i - y_i|p\right){1/p}),當 (p=2) 時為歐氏距離,當 (p=1) 時為曼哈頓距離。
- K值的選擇
- K值的選擇對算法性能至關重要。如果K值過小,模型容易受到噪聲數據的影響,導致過擬合;如果K值過大,模型可能會將遠離目標點的數據也納入考慮范圍,導致欠擬合。
- 通常需要通過交叉驗證等方法來選擇合適的K值。例如,可以嘗試不同的K值,計算每個K值下的模型性能指標(如準確率、召回率等),選擇性能最優的K值。
- 投票機制
- 分類任務:對于分類問題,算法會統計目標點周圍最近的K個鄰居中每個類別的數量,然后選擇數量最多的類別作為目標點的預測類別。例如,如果K=5,目標點周圍有3個鄰居屬于類別A,2個鄰居屬于類別B,那么目標點將被預測為類別A。
- 回歸任務:對于回歸問題,算法會計算目標點周圍最近的K個鄰居的值的平均值或加權平均值作為目標點的預測值。例如,如果K=3,目標點周圍3個鄰居的值分別為1、2、3,那么目標點的預測值可以是 ((1+2+3)/3=2)。
三、算法流程
- 數據預處理
- 歸一化:由于KNN算法依賴距離計算,因此特征值的范圍對結果影響很大。需要對數據進行歸一化處理,將所有特征值縮放到相同的范圍(如0 - 1或 - 1到1)。常用的歸一化方法有最小 - 最大歸一化 ((x - \text{min})/(\text{max} - \text{min})) 和Z - score標準化 ((x - \mu)/\sigma),其中 (\mu) 是均值,(\sigma) 是標準差。
- 去除噪聲數據:噪聲數據可能會干擾KNN算法的預測結果,因此需要通過數據清洗等方法去除噪聲數據。
- 計算距離
- 對于每個測試樣本,計算其與訓練集中所有樣本之間的距離。根據選擇的距離度量方式(如歐氏距離、曼哈頓距離等),計算每個樣本之間的距離值。
- 選擇最近的K個鄰居
- 根據計算出的距離,對訓練集中的樣本進行排序,選擇距離最近的K個樣本作為目標點的鄰居。
- 投票或平均
- 對于分類問題,統計這K個鄰居中每個類別的數量,選擇數量最多的類別作為預測結果;對于回歸問題,計算這K個鄰居的值的平均值或加權平均值作為預測結果。
四、優缺點
- 優點
- 簡單易實現:KNN算法原理簡單,實現起來也非常容易,不需要復雜的數學推導和優化過程。
- 無需訓練模型:KNN算法不需要像其他算法(如神經網絡、決策樹等)那樣進行復雜的模型訓練,直接基于數據點之間的距離進行預測,適合小規模數據集。
- 對數據的適應性強:KNN算法對數據的分布沒有假設,可以很好地適應各種類型的數據,包括線性和非線性數據。
- 缺點
- 計算效率低:KNN算法需要計算測試樣本與訓練集中所有樣本之間的距離,對于大規模數據集,計算量非常大,效率較低。
- 存儲要求高:KNN算法需要存儲整個訓練數據集,占用大量的存儲空間。
- 對特征的權重不敏感:KNN算法對所有特征一視同仁,沒有考慮不同特征對目標變量的重要性,可能會受到無關特征的干擾。
五、應用場景
- 圖像識別:KNN算法可以用于圖像分類任務,例如手寫數字識別。通過計算圖像像素之間的距離,可以將新的圖像與已知的數字圖像進行對比,從而識別出數字的類別。
- 文本分類:在文本分類中,KNN算法可以用于判斷文本的類別。例如,將文本轉換為向量形式(如TF - IDF向量),然后計算文本之間的距離,根據最近的K個鄰居的類別來判斷文本的類別。
- 推薦系統:KNN算法可以用于基于用戶的推薦系統。通過計算用戶之間的相似度(如購買行為、評分等),找到與目標用戶最相似的K個用戶,然后將這些用戶喜歡的物品推薦給目標用戶。
六、代碼實現(Python示例)
以下是使用Python實現KNN算法的簡單示例:
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 示例數據
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)# 創建KNN模型
knn = KNeighborsClassifier(n_neighbors=3)# 訓練模型
knn.fit(X_train, y_train)# 進行預測
y_pred = knn.predict(X_test)# 計算準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"準確率:{accuracy}")
七、總結
KNN算法是一種簡單而有效的機器學習算法,適用于分類和回歸任務。它基于數據點之間的距離進行預測,具有簡單易實現、對數據適應性強等優點,但也存在計算效率低、存儲要求高等缺點。在實際應用中,需要根據數據的特點和任務需求選擇合適的K值和距離度量方式,并對數據進行預處理,以提高算法的性能。