K-鄰近算法的原理很簡單,就是用你的「鄰居」來推斷出你的類別。用於離散型數據分析處理。算法
例子1:以下圖有ABCD四個用於參考的樣本點,都已知曉本身的座標位置,這時E來了,不清楚本身的位置,就分別計算出於ABCD個點的距離,發現和A最近,就認爲與A的位置相同(既「類別「」相同)。學習
例子2:看到好多教程用過的一個例子,以下圖所示。根據樣本出現的不一樣類別的鏡頭數量判斷未知電影的屬於什麼類別,也是算出與各個樣本的距離,而後作出判別。測試
專業定義:若是一個樣本在特徵空間中的k個最類似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。
來源:KNN算法最先是由Cover和Hart提出的一種分類算法spa
根據原理和定義,有兩個陌生的詞。3d
(1)距離計算公式code
兩個樣本的距離能夠經過以下公式計算,又叫歐式距離。類似的樣本,特徵之間的值應該都是相近的。
好比說,a(a1,a2,a3),b(b1,b2,b3)orm
(2)K的取值blog
所謂K值就是設置一個比較上限,就好比上面的例子2中,總共6個樣本,若是K=1,即只參考距離最小的那個樣本,這個樣本爲愛情片就預測成愛情片,若是K=3,就參考距離最低的三個值,發現100%都是愛情片,若是K=5,則發現愛情片佔比60%,若是K=6,各佔比50%,無法給結果了。因此K值不必定如例子1同樣只爲1,也可設成其餘數用於給最終結果投票。教程
注:內存
若是K值取很小則容易受異常點影響,若是K值取很大則容易受樣本k值數量(類別)波動。因此就有調參的過程了,選取一個合適的k值。
須要進行標準化,若不標準,數值大的特徵將決定性的影響最終結果,標準化後,各個特徵的權重比例均衡了。
優勢:簡單,易於實現,無需估計參數,無需訓練,結果固定,無迭代過程。
缺點:由於每次都要跟全部樣本進行計算,計算量大,內存消耗大,且必須指定K值,K值選定不當則分類精度不能保證。
使用場景:小數據場景,由於缺點較多,大部分時候都不用。
# coding=utf-8 from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler import pandas as pd def knncls(): """ K-鄰近預測用戶簽到位置 :return: None """ # 讀取數據 數據來源:https://www.kaggle.com/c/facebook-v-predicting-check-ins/data data = pd.read_csv("./train.csv") # print(data.head(10)) # 處理數據 # 一、縮小數據,查詢數據篩選 data = data.query("x > 1.0 & x < 1.25 & y > 2.5 & y > 7.5") # 二、處理時間 time_value = pd.to_datetime(data["time"], unit="s") # print(time_value) # 構造特徵 time_value = pd.DatetimeIndex(time_value) data["day"] = time_value.day data["hour"] = time_value.hour data["weekday"] = time_value.weekday # 把時間戳特徵刪除 data = data.drop(['time'], axis=1) # print(data) # 把簽到數量少於n個目標位置刪除 place_count = data.groupby('place_id').count() # print(place_count) tf = place_count[place_count.row_id > 3].reset_index() # print(tf) data = data[data['place_id'].isin(tf.place_id)] data = data.drop(['row_id'], axis=1) # print(data) # 取出數據當中的特徵值和目標值 y = data['place_id'] x = data.drop(['place_id'], axis=1) # 進行數據的分割訓練集和測試集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25) # 特徵工程(標準化) std = StandardScaler() # 對測試集和訓練集的特徵值標準化 x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 進行算法流程 knn = KNeighborsClassifier(n_neighbors=5) knn.fit(x_train, y_train) # 得出預測結果 y_predict = knn.predict(x_test) print("預測的目標籤到位置爲:", y_predict) print("預測的準確率:", knn.score(x_test, y_test)) if __name__ == '__main__': knncls()
以上內容僅供相互學習,是做者根據學習教程作的筆記。