1. 程式人生 > >機器學習之利用KNN近鄰算法預測數據

機器學習之利用KNN近鄰算法預測數據

plt 部分 制圖 標簽 預測 最近鄰 特征值 learn xlsx

前半部分是簡介, 後半部分是案例


KNN近鄰算法:
簡單說就是采用測量不同特征值之間的距離方法進行分類(k-Nearest Neighbor,KNN)

優點: 精度高、對異常值不敏感、無數據輸入假定
缺點:時間復雜度高、空間復雜度高

  • 1、當樣本不平衡時,比如一個類的樣本容量很大,其他類的樣本容量很小,輸入一個樣本的時候,K個臨近值中大多數都是大樣本容量的那個類,這時可能就會導致分類錯誤。改進方法是對K臨近點進行加權,也就是距離近的點的權值大,距離遠的點權值小。
  • 2、計算量較大,每個待分類的樣本都要計算它到全部點的距離,根據距離排序才能求得K個臨近點,改進方法是:先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。

適用數據範圍:

  • 標稱型(離散型):標稱型目標變量的結果只在有限目標集中取值,如真與假(標稱型目標變量主要用於分類)
  • 數值型:數值型目標變量則可以從無限的數值集合中取值,如0.100,42.001等 (數值型目標變量主要用於回歸分析)

工作原理:

  • 訓練樣本集—>存在一個樣本數據集合,也稱作訓練樣本集,並且樣本集中每個數據都存在標簽,即我們知道樣本集中每一數據與所屬分類的對應關系。輸人沒有標簽的新數據後,將新數據的每個特征與樣本集中數據對應的特征進行比較,然後算法提取樣本集中特征最相似數據(最近鄰)的分類標簽。一般來說,我們只選擇樣本數據集中前K個最相似的數據,這就是K-近鄰算法中K的出處,通常K是不大於20的整數。 最後 ,選擇K個最相似數據中出現次數最多的分類,作為新數據的分類。
  • 電影類別KNN分析(圖片來源於網絡)

技術分享圖片

技術分享圖片

  • 歐氏距離(Euclidean Distance,歐幾裏得度量)

技術分享圖片

  • 計算過程圖

技術分享圖片

  • 案例
    代碼都是在 jupyter notebook 中寫的
 1 import numpy as np
 2 import pandas as pd
 3 from pandas import Series,DataFrame
 4 import matplotlib.pyplot as plt
 5 %matplotlib inline
 6 # 以上導入的包都是自己習慣性導入, 因為隨時都可能會用到, 就每次先把這些都導入了
 7 
 8
#這兒是我自己寫了一個excel表格,方便快速的讀取數據, 演示使用, 就不用series或者dataframe寫了 9 film = pd.read_excel(films.xlsx,sheet_name=1) 10 #輸入film後出現表格 11 fil

技術分享圖片

 1 # 電影的樣本特征
 2 train=film[[動作鏡頭,接吻鏡頭]]   
 3 # 樣本標簽,即要預測的標簽,這兒要預測新數據是屬於什麽類別的電影
 4 target=film[電影類別]   
 5 # 創建機器學習模型,需要導入
 6 from sklearn.neighbors import KNeighborsClassifier
 7 # 創建對象, 這兒的數據因為是離散型, 所以使用KNeighborsClassifier,
 8 knn=KNeighborsClassifier()
 9 #  對knn模型進行訓練, 傳入樣本特征 和 樣本標簽
10 # 構建函數原型、構建損失函數、求損失函數最優解
11 knn.fit(train,target)
12 knn

當輸入knn後出現如下代碼, 表示訓練完成

1 KNeighborsClassifier(algorithm=auto, leaf_size=30, metric=minkowski,
2            metric_params=None, n_jobs=1, n_neighbors=5, p=2,
3            weights=uniform)
1 # 這兒隨意寫3個樣本數據,需要按照樣本數據的維度來寫
2 cat=np.array([[5,19],[21,6],[23,24]])
3 # cat=np.array([[21,4]])  也可以寫1個
4 # 使用predict函數對數據進行預測
5 knn.predict(cat)

運行會出現下圖:

技術分享圖片

預測完成 ! 成功判斷出3個新樣本的歸屬類別
接下來也可以繪制圖, 直觀的查看近鄰情況

1 # scatter畫出來的是散點圖, 取數據使用 .values,二維數組中, 一維全部取出, 二維取0,表示出來就是[:,0]
2 plt.scatter(train.values[:,0],train.values[:,1])
3 # scatter可以有一些屬性, 下邊的color可以自定義顯示的顏色
4 plt.scatter(cat[:,0],cat[:,1],color=red)

效果圖為:

技術分享圖片

在使用KNN近鄰算法時, 註意要分清楚樣本集, 樣本特征,樣本標簽


技術交流可以留言評論哦 ! 虛心學習, 不忘初心, 共同奮進 !

機器學習之利用KNN近鄰算法預測數據