演算法金 | 再見!!!KNN

算法金「全网同名」發表於2024-06-06


大俠幸會,在下全網同名「演算法金」 0 基礎轉 AI 上岸,多個演算法賽 Top 「日更萬日,讓更多人享受智慧樂趣」

KNN演算法的工作原理簡單直觀,易於理解和實現,這使得它在各種應用場景中備受青睞。

我們將深入探討KNN演算法,從基本概念到實現細節,從演算法最佳化到實際應用,我們都會一一展開。透過本文,你將瞭解到KNN演算法的核心要點,以及如何將這一強大的工具應用到實際問題中。

第一部分:KNN演算法的基本概念

定義

KNN演算法,全稱為K-Nearest Neighbors,是一種基於例項的學習演算法,或者說是一種基於記憶的學習方法。它的核心思想是,透過一個樣本的K個最近鄰居的多數屬於某個類別,來預測該樣本的類別。

工作原理

KNN演算法透過以下步驟進行分類或迴歸:

  1. 確定距離度量:首先確定一個距離度量方法,如歐氏距離或曼哈頓距離。
  2. 尋找最近鄰居:計算待分類樣本與資料集中每個樣本的距離,並找出距離最近的K個樣本。
  3. 決策:在分類任務中,透過多數投票法決定待分類樣本的類別;在迴歸任務中,則透過計算K個最近鄰居的屬性的平均值來預測。

演算法特點

KNN演算法具有以下顯著特點:

  • 簡單性:演算法原理簡單,易於理解和實現。
  • 無需訓練:不需要訓練階段,直接使用整個資料集進行預測。
  • 自適應性:隨著資料集的變化,KNN演算法可以自適應地調整其預測結果。

第二部分:KNN演算法的工作原理

距離度量

在KNN演算法中,距離度量是確定樣本之間相似性的關鍵。以下是幾種常用的距離度量方法:

尋找最近鄰居

確定一個樣本的K個最近鄰居涉及以下步驟:

  1. 計算距離:對於資料集中的每個點,使用選定的距離度量計算與待分類樣本的距離。
  2. 排序:根據計算出的距離對所有點進行排序。
  3. 選擇鄰居:選擇距離最小的前K個點作為最近鄰居。

多數投票法(分類任務)

在分類任務中,KNN演算法透過以下步驟進行決策:

  1. 收集標籤:收集K個最近鄰居的類別標籤。
  2. 統計:統計每個類別的出現次數。
  3. 投票:選擇出現次數最多的類別作為待分類樣本的預測類別。

平均值法(迴歸任務)

在迴歸任務中,KNN演算法預測一個連續值,通常透過以下步驟:

  1. 收集屬性值:收集K個最近鄰居的屬性值。
  2. 計算平均值:計算這些屬性值的平均值。
  3. 預測:將平均值作為待分類樣本的預測結果。

第三部分:KNN演算法的優缺點

優點

  1. 易於理解和實現:KNN演算法的原理簡單直觀,易於理解,且實現起來相對容易。
  2. 不需要訓練階段:由於KNN演算法在預測時直接使用整個資料集,因此它不需要一個專門的訓練階段。
  3. 自適應性強:KNN演算法能夠隨著資料集的更新而更新,能夠適應資料的變化。
  4. 可用於非線性問題:KNN演算法不假設資料的分佈,因此可以用於非線性問題的分類和迴歸。

缺點

  1. 計算密集型:由於在每次預測時都需要計算新樣本與所有訓練樣本之間的距離,KNN演算法在大資料集上可能變得非常慢。
  2. 儲存需求高:KNN演算法需要儲存全部資料集,因此對記憶體的需求較高。
  3. 維數災難:隨著特徵維度的增加,距離度量可能會變得不那麼有效,導致所謂的“維數災難”。
  4. 對不平衡資料敏感:KNN演算法對類別不平衡的資料集比較敏感,少數類可能會被多數類所淹沒。
  5. 對噪聲敏感:KNN演算法對噪聲資料點比較敏感,噪聲點可能會對預測結果產生較大影響。

第四部分:KNN演算法的適用場景與侷限性

適用場景

  1. 小規模資料集:KNN演算法在小規模資料集上表現良好,因為它不需要複雜的訓練過程。
  2. 基線模型:作為基線模型,KNN演算法可以快速提供一個簡單的效能標準,用於與其他更復雜的模型進行比較。
  3. 實時決策:由於KNN演算法不需要預先訓練,它可以用於需要快速響應的實時決策場景。
  4. 低維資料:在特徵維度不是非常高的情況下,KNN演算法能夠很好地工作,因為它依賴於距離度量。

侷限性

  1. 高計算成本:對於大規模資料集,KNN演算法在預測時的計算成本非常高。
  2. 記憶體消耗:由於需要儲存整個資料集,KNN演算法對記憶體的需求可能會很大。
  3. 資料不平衡問題:當資料集中某些類別的樣本數量遠多於其他類別時,KNN演算法可能會傾向於預測多數類。
  4. 噪聲敏感性:KNN演算法對異常值和噪聲點比較敏感,這可能會影響其預測的準確性。

第五部分:KNN演算法的實現與案例

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris

# 載入內建的Iris資料集
iris = load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names

# 資料標準化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 資料視覺化(選擇前兩個特徵進行視覺化)
plt.figure(figsize=(10, 6))
for i, label in enumerate(target_names):
    plt.scatter(X[y == i, 0], X[y == i, 1], label=label)
plt.xlabel('特徵 1 (標準化)')
plt.ylabel('特徵 2 (標準化)')
plt.title('Iris 資料分佈')
plt.legend()
plt.show()

# 劃分資料集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 選擇最佳K值
best_k = 1

# 使用最佳K值訓練模型
best_knn = KNeighborsClassifier(n_neighbors=best_k)
best_knn.fit(X_train, y_train)
accuracy = best_knn.score(X_test, y_test)
print(f"測試集上的準確率: {accuracy:.2f}")

# 視覺化測試結果(選擇前兩個特徵進行視覺化)
plt.figure(figsize=(10, 6))
y_pred = best_knn.predict(X_test)
for i, label in enumerate(target_names):
    plt.scatter(X_test[y_test == i, 0], X_test[y_test == i, 1], label=f'真實: {label}')
for i, label in enumerate(target_names):
    plt.scatter(X_test[y_pred == i, 0], X_test[y_pred == i, 1], marker='x', label=f'預測: {label}')
plt.xlabel('特徵 1 (標準化)')
plt.ylabel('特徵 2 (標準化)')
plt.title('測試集上的預測結果')
plt.legend()
plt.show()

看執行輸出,還是挺強的

第六部分:如何選擇K值

選擇合適的K值是KNN演算法效能的關鍵因素之一,如下圖不同的 K值,K=3 和 K=7 結果就不一樣了。

以下是一些選擇K值的策略:

經驗法則

選擇K值時,可以遵循一些經驗法則:

  • 對於分類問題,K通常是奇數,以避免平票的情況。
  • K值通常小於20,並且與資料集中的樣本數量成反比。

交叉驗證

交叉驗證是一種更系統的方法來確定最佳的K值。以下是步驟:

  1. 劃分資料:將資料集劃分為訓練集和測試集。
  2. 迴圈選擇K值:對一系列可能的K值進行迴圈。
  3. 訓練和評估:對於每個K值,使用訓練集訓練KNN模型,並在測試集上評估其效能。
  4. 選擇最佳K值:選擇在測試集上表現最好的K值。

以下是使用交叉驗證選擇K值的Python程式碼示例:

from sklearn.model_selection import cross_val_score

# 可能的K值列表
k_values = list(range(1, 21))
accuracies = []

for k in k_values:
    knn = KNeighborsClassifier(n_neighbors=k)
    # 使用交叉驗證評估模型效能
    accuracy = cross_val_score(knn, X, y, cv=10).mean()
    accuracies.append(accuracy)

# 找到最佳K值
best_k = k_values[np.argmax(accuracies)]
print(f"最佳K值為:{best_k}")

資料集大小與K值的關係

  • 小資料集:選擇較小的K值,因為資料點較少,每個點的影響較大。
  • 大資料集:可以選擇較大的K值,因為資料點較多,每個點的影響較小。

執行後輸出

啊這,各種類別交織在一起 看起來密集恐懼症都要犯了

  • 這段程式碼生成了一張散點圖,不同門派用不同顏色表示,展示了內力和速度的標準化分佈。
  • 透過迴圈選擇不同的 K 值進行交叉驗證,找到表現最好的 K 值.這張圖展示了不同 K 值下的交叉驗證準確率,可以看到在 K=4 時準確率最高。
  • 我們使用最佳 K 值(K=4)訓練模型,並在測試集上進行預測和視覺化,這張圖展示了測試集上真實標籤和預測標籤的對比(略)
  • 模型的預測準確率較低,這主要是資料集的問題,資料類別見區分度太低了,感興趣的大俠可以試著調一下,怎麼可以獲得更高的準確率。期待能在評論區見

第七部分:KNN演算法的最佳化策略

為了提高KNN演算法的效能和適用性,我們可以採取以下幾種最佳化策略:

距離度量的選擇

選擇適當的距離度量對於KNN演算法至關重要。根據資料的特性,可以選擇不同的度量方法:

權重分配

在標準KNN中,所有鄰居對預測結果的貢獻是相等的。然而,我們可以根據距離的遠近來分配權重,使得更近的鄰居對預測結果有更大的影響。權重可以按照以下公式計算:

降維技術

高維資料會加劇“維數災難”,導致KNN演算法效能下降。使用降維技術如主成分分析(PCA)可以減少特徵維度,同時保留資料的主要資訊:

from sklearn.decomposition import PCA

# 應用PCA進行降維
pca = PCA(n_components=2)  # 假設我們只保留兩個主成分
X_pca = pca.fit_transform(X)

# 現在使用降維後的資料訓練KNN模型
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_pca, y)

其他最佳化方法

  • 使用不同的距離權重:根據問題的特性,可以為不同的特徵賦予不同的距離權重。
  • 動態選擇K值:根據樣本的區域性密度動態調整K值,以適應資料的不均勻分佈。

第八部分:KNN演算法與其他演算法的比較

在機器學習領域,選擇正確的演算法對於解決特定問題至關重要。KNN演算法因其簡單性和直觀性而廣受歡迎,但與其他演算法相比,它也有其侷限性。以下是KNN演算法與幾種常見演算法的比較:

與決策樹的比較

  • 決策樹:是一種監督學習演算法,可以用於分類和迴歸。它透過學習簡單的決策規則從資料特徵中推斷出目標值。
  • 優點:易於理解和解釋,可以處理分類和迴歸問題,對噪聲資料具有一定的魯棒性。
  • 缺點:容易過擬合,對於不平衡的資料集表現不佳。

與支援向量機(SVM)的比較

  • 支援向量機:是一種強大的分類器,也可以用於迴歸問題(稱為SVR)。它透過找到資料點之間的最優邊界來區分不同的類別。
  • 優點:在高維空間中表現良好,對於線性和非線性問題都有解決方案。
  • 缺點:引數選擇(如懲罰引數C和核函式)對效能影響很大,計算複雜度較高。

與隨機森林的比較

  • 隨機森林:是一種整合學習方法,由多個決策樹組成。它透過構建多個樹並進行投票來提高模型的準確性和魯棒性。
  • 優點:通常比單個決策樹更準確,能夠處理高維資料,對過擬合有一定的抵抗力。
  • 缺點:模型可解釋性較差,訓練時間可能較長。

不同場景下演算法選擇的建議

  • 資料集大小:對於小資料集,KNN和決策樹可能更合適;對於大資料集,考慮使用SVM或隨機森林。
  • 資料維度:對於低維資料,KNN可以表現良好;對於高維資料,SVM或隨機森林可能更合適。
  • 模型解釋性:如果需要模型具有較高的解釋性,決策樹可能是更好的選擇。
  • 計算資源:如果計算資源有限,應考慮使用計算成本較低的演算法,如KNN或決策樹。

[ 抱個拳,總個結 ]

在本文中,我們深入探討了KNN演算法的各個方面,從基本概念到實現細節,再到最佳化策略和與其他演算法的比較。KNN演算法以其簡單直觀的原理、易於實現的特點以及在小規模和低維資料集上的良好效能,確立了其在機器學習領域中的重要地位。

核心要點總結:

  • 定義:KNN是一種基於例項的分類和迴歸演算法,透過查詢測試樣本的K個最近鄰居來進行預測。
  • 工作原理:演算法利用距離度量來確定最近鄰居,並透過多數投票法或平均值法來進行決策。
  • 優點:易於理解和實現,不需要訓練階段,自適應性強。
  • 缺點:計算密集型,儲存需求高,對不平衡資料和噪聲敏感。
  • 適用場景:小規模資料集,基線模型,實時決策,低維資料。
  • 最佳化策略:包括選擇合適的距離度量,權重分配,以及應用降維技術。

KNN演算法雖然簡單,但在許多實際應用中表現出色,尤其是在資料集較小且特徵維度較低的情況下。然而,它也存在一些侷限性,如高計算成本和對噪聲的敏感性,這要求我們在應用時需要謹慎考慮。

[ 演算法金,碎碎念 ]

全網同名,日更萬日,讓更多人享受智慧樂趣

如過覺得內容有價值,煩請大俠多多 分享、在看、點贊,助力演算法金又猛又持久、很黃很 BL 的日更下去;

同時邀請大俠 關注、星標 演算法金,圍觀日更萬日,助你功力大增、笑傲江湖

相關文章