1) 實現過程
2) 距離的確定
該演演算法的「距離」在二維座標軸就表示兩點之間的距離,計算距離的公式有很多。
我們常用尤拉公式,即「歐氏距離」。(x1、x2、x3為特徵)
$$
\sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + (x_3 - y_3)^2+...+(x_n - y_n)^2} =\sqrt{ \sum_{i=1}{n}{(x_i-y_i)2}}
$$
演演算法超引數是 k(人為設定的引數為超引數),k 可以理解為標記資料周圍幾個數作為參考物件,引數選擇需要根據資料來決定。(通過學習曲線找最優的k)
變種一:預設情況下,在計算距離時,權重都是相同的,但實際上我們可以針對不同的鄰居指定不同的距離權重,比如距離越近權重越高。
變種二:使用一定半徑內的點取代距離最近的 k 個點
# 紅酒引數
rowdata = {'顏色深度':[14.13,13.2,13.16,14.27,13.24,12.07,12.43,11.79,12.37,12.04],
'酒精濃度': [5.64,4.28,5.68,4.80,4.22,2.76,3.94,3.1,2.12,2.6],
'品種': [0,0,0,0,0,1,1,1,1,1]}
# 0 代表 「黑皮諾」,1 代表 「赤霞珠」
wine_data = pd.DataFrame(rowdata)
def KNN(x): #x是輸入的點 返回類別
# 1.把10個訓練資料提取到data中
data = wine_data.iloc[:,:2].values #將前兩列提取出來----data
# 2. 新資料點與10個一維陣列的歐式距離
# 資料點第一個特徵與10個點的歐式距離
a = ((x-data) ** 2)[:,0] #第一列抽取出來
# 資料點第二個特徵與10個點的歐式距離
b = ((x-data) ** 2)[:,1] #第二列抽取出來
# 得到資料點與10個點的歐氏距離
Distance = np.sqrt(a+b)
np.sort(Distance)
# 3.排序找出最近的K個點 K=3
K3 = np.argsort(Distance)[:3] #得到開始表的索引值 6 1 4
# 4.判斷類別
y = wine_data.品種
# 根據頻數統計判斷屬於哪一類
return pd.Series([y[i] for i in K3]).value_counts().idxmax()
KNN([[12.3,4.1]])
# OUT:0
scikit-learn,簡稱 sklearn, 支援了包括分類、迴歸、降維和聚類四大機器學習演演算法,以及特徵提取、資料預處理和模型評估三大模組。
主要設計原則:
1) 一致性
所有物件共用一個簡單一致的介面(介面)。
2)監控
3)防止類擴散
4) 合成
5)合理預設值
6)SKlearn KNN 實現
class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None)[source]
引數名 | 形式 | 意義 |
---|---|---|
n_neighbors | int, default=5 | 近鄰 個數 |
weights | {‘uniform’, ‘distance’}, callable or None, default=’uniform’ | • 'uniform':預設引數,不管遠近權重都一樣,就是最普通的 KNN 演演算法的形式。 • 'distance':權重和距離成反比,距離預測目標越近具有越高的權重。 • 自定義函數:自定義一個函數,根據輸入的座標值返回對應的權重,達到自定義權重的目的。 |
algorithm | {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’ | •'brute' :蠻力實現 • 'kd_tree':KD 樹實現 KNN • 'ball_tree':球樹實現 KNN • 'auto': 預設引數,自動選擇合適的方法構建模型 |
leaf_size | int, default=30 | 當使用KD樹或球樹,它就是是停止建子樹的葉子節點數量的閾值 |
p | int, default=2 | p=1為曼哈頓距離 p=2為歐式距離 |
metric | str or callable, default=’minkowski‘ | • 'euclidean' :歐式距離 • 'manhattan':曼哈頓距離 • 'chebyshev':切比雪夫距離 • 'minkowski': 閔可夫斯基距離,預設引數 |
n_jobs | int, default=None | 指定多少個CPU進行運算,-1表示全部都算 |
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
clf = clf.fit(wine_data.iloc[:,0:2].values,wine_data.iloc[:,-1].values)
#測試單個點
clf.predict([[12.3,4.1]])
# OUT: array([0]) 屬於「黑皮諾」紅酒