目錄
一、介紹
K最近鄰(KNN)算法是一種監督的ML算法,可用於分類以及迴歸預測問題。但是,它主要用於行業中的分類預測問題。以下兩個屬性將很好地定義KNN:
- 惰性學習算法:因爲它沒有專門的訓練階段,並且在分類時將所有數據用於訓練。
- 非參數學習算法 :因爲它不假設有關基礎數據的任何信息。
二、工作流程
K最近鄰(KNN)算法使用“特徵相似性”來預測新數據點的值,這意味着,將根據新數據點與訓練集中的點的匹配程度爲該新數據點分配一個值。我們可以通過以下步驟瞭解其工作方式:
步驟1:加載訓練以及測試數據。
步驟2:選擇K的值,即最近的數據點(K可以是任何整數)。
步驟3:對於測試數據中的每個點,請執行以下操作:
-
藉助以下任意一種方法來計算測試數據與訓練數據的每一行之間的距離:歐幾里得距離,曼哈頓距離或漢明距離。最常用的距離計算方法是歐幾里得。
-
基於距離值,將它們按升序排序。
-
然後它將從排序後的數組中選擇前K行。
-
現在,它將基於這些行中最多出現的類別爲測試點分配這一個類。
步驟4:結束。
三、示例
以下是瞭解K的概念和KNN算法的工作的示例。
假設我們有一個可以繪製如下的數據集。如下:
現在,我們需要將帶有黑點(在點60,60處)的新數據點分類爲藍色或紅色類。我們假設K = 3,即它將找到三個最近的數據點。如圖所示:
我們可以在上圖中看到帶有黑點的數據點的三個最近鄰居。在這三個中,有兩個屬於紅色等級,因此黑點也將被分配爲紅色等級。
四、用Python實現
1.模擬數據及繪圖
# 導入相應的包
import numpy as np
import matplotlib.pyplot as plt
# 模擬數據
raw_data_X = [[3.39, 2.33],
[3.11, 1.78],
[1.34, 3.36],
[3.58, 4.67],
[2.28, 2.86],
[7.42, 4.69],
[5.74, 3.53],
[9.17, 2.51],
[7.79, 3.42],
[7.93, 0.79]]
raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
X_train = np.array(raw_data_X)
y_train = np.array(raw_data_y)
# 繪製散點圖
plt.scatter(X_train[y_train==0, 0], X_train[y_train==0, 1], color='g')
plt.scatter(X_train[y_train==1, 0], X_train[y_train==1, 1], color='r')
plt.show()
# 加入一個新數據點
X = np.array([8.09, 3.36])
# 繪製增加新數據點的散點圖
plt.scatter(X_train[y_train==0, 0], X_train[y_train==0, 1], color='g')
plt.scatter(X_train[y_train==1, 0], X_train[y_train==1, 1], color='r')
plt.scatter(X[0], X[1], color='b')
plt.show()
2.KNN過程
①計算距離
# 其他數據分別與新數據點之間的距離
from math import sqrt
# 方法一
distance = []
for x_train in X_train:
d = sqrt(np.sum((x_train - X)**2))
distance.append(d)
distance
# 方法二
distance = [sqrt(np.sum((x_train - X)**2)) for x_train in X_train]
[4.811538215581374,
5.224633958470201,
6.75,
4.696402878799901,
5.831474942070831,
1.489227987918573,
2.356140912594151,
1.3743725841270265,
0.30594117081556693,
2.574975728040946]
②基於距離值,將它們按升序排序
# 升序排序(按下標排序)
nearest = np.argsort(distance)
nearest
array([8, 7, 5, 6, 9, 3, 0, 1, 4, 2], dtype=int64)
③將從排序後的數組中選擇前K行
# 設k爲6
k = 6
# 從排序後的數組中顯示前k行對應的類型
topK_y = [y_train[i] for i in nearest[:k]]
topK_y
[1, 1, 1, 1, 1, 0]
④基於這些行中最多出現的類別爲測試點分配這一個類
# 導入統計數據包
from collections import Counter
# 顯示各類對應的數量
votes = Counter(topK_y)
votes
Counter({1: 5, 0: 1})
可知1出現的次數最多爲5。,該新增數據點的類型爲1,紅色。
votes.most_common(2) # 顯示爲[(1, 5), (0, 1)]
votes.most_common(1) # 顯示爲[(1, 5)]
votes.most_common(1)[0][0] # 顯示爲1
# 預測數據
predict_y = votes.most_common(1)[0][0]
predict_y
1
3.使用scikit-learn中的KNN
# 導包
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
# 設置k爲6
kNN_classifier = KNeighborsClassifier(n_neighbors = 6)
# 訓練
raw_data_X = [[3.39, 2.33],
[3.11, 1.78],
[1.34, 3.36],
[3.58, 4.67],
[2.28, 2.86],
[7.42, 4.69],
[5.74, 3.53],
[9.17, 2.51],
[7.79, 3.42],
[7.93, 0.79]]
raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
X_train = np.array(raw_data_X)
y_train = np.array(raw_data_y)
kNN_classifier.fit(X_train, y_train)
# 新數據
X = np.array([8.09, 3.36])
X_predict = X.reshape(1, -1)
# 預測數據
y_predict = kNN_classifier.predict(X_predict)
y_predict[0]
1
五、KNN的優缺點
1.優點
-
一種非常簡單的算法,易於理解和解釋。
-
對於非線性數據非常有用,因爲此算法中沒有關於數據的假設。
-
一種通用算法,因爲我們可以將其用於分類和迴歸。
-
它具有相對較高的準確性,但是有比KNN更好的監督學習模型。
2.缺點
-
這是一種計算上有點昂貴的算法,因爲它存儲了所有訓練數據。
-
與其他監督學習算法相比,需要高存儲容量。
-
大N時預測很慢。
-
它對數據規模以及不相關的功能非常敏感。
六、KNN的應用
以下是可以成功應用KNN的一些領域:
1.銀行系統
KNN可以在銀行系統中用於預測個人適合貸款審批的天氣嗎?該個人是否具有與違約者相似的特徵?
2.計算信用等級
通過與具有相似特徵的人進行比較,可以使用KNN算法查找個人的信用等級。
3.政治
藉助KNN算法,我們可以將潛在選民分爲多個類別,例如“將投票”,“將不投票”,“將對黨的代表大會投票”,“將對黨的代表投票”。
4.其他領域
語音識別,手寫檢測,圖像識別和視頻識別。