K 近鄰 (KNN,K Nearest Neighbours) 是一種分類算法。python
算法的思想爲:要判斷一個東西屬於哪一類,看看跟它特徵最近似的 K 個東西都屬於什麼,若是這 K 個東西屬於 A 類的最多,那咱們就認爲未知的那個東西也是 A 類的。git
舉個栗子,小明拿到一個水果,皮是黃色的,能夠剝開,甜甜的軟軟的,這時候麻麻買回來了一串香蕉一袋橘子,小明發現香蕉跟你拿的這個東西好像哦,因而他認定本身拿的這個水果也是香蕉。這是否是有點像小朋友認識東西的過程呢?github
與以前學習的算法不一樣的是,KNN 屬於「非參數方法」。也就是說,咱們沒有假設樣本符合什麼樣的分佈狀況,沒有把分類問題轉換爲求解參數的過程。算法
如圖,假設輸入特徵是二元的,咱們把樣本數據的特徵 $(x_1,x_2)$ 做爲二維平面的點座標,並用不一樣形狀表示樣本的類。那麼想要判斷點屬於哪一類,只要把它也放在平面中,觀察離它最近的 K(圖中 K = 5)個點,發現三角形最多,因而須要預測的點就能夠被認爲屬於三角形所表明的類。dom
咱們一般使用「歐氏距離」來表示兩數據點的相近程度。當輸入特徵爲多元時,假設平面中有兩點 $x = (x_1,x_2,...x_n)$ 和 $y = (y_1,y_2,...y_n)$,其距離爲學習
$$distance = \sqrt{\sum_i^n(x_i - y_i)^2}$$測試
注意:.net
使用歐氏距離存在一個問題,若是不一樣特徵的值不在一個數量級上,那麼數量級大的特徵將會對距離產生決定性影響,因此,咱們須要先進行「數據預處理」,對特徵進行縮放。rest
示例數據地址:GitHub - Avik-Jain/100-Days-Of-ML-Code/datasetscode
# 導入庫 import numpy as np import matplotlib.pyplot as plt import pandas as pd # 導入數據 dataset = pd.read_csv('Social_Network_Ads.csv') X = dataset.iloc[:, [2, 3]].values y = dataset.iloc[:, 4].values # 分割 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0) # 特徵縮放 from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
from sklearn.neighbors import KNeighborsClassifier classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2) classifier.fit(X_train, y_train)
# 使用測試集預測 y_pred = classifier.predict(X_test) # 生成混淆矩陣 from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred)
歡迎關注 Evan 的博客