K-近鄰算法(KNN)

     拜讀大神的系列教程,大神好像姓崔(猜想),大神根據《機器學習實戰》來說解,講的很清楚,讀了大神的博客後,我也把我本身吸取的寫下來,可能有不少錯誤之處,但願拍磚(拍輕點)html

    大神博客: https://cuijiahua.com/blog/2017/11/ml_1_knn.html  ,寫得很好算法

   話很少說:機器學習

   前言:函數

  KNN算法應該是最簡單的方法了(估計沒有之一),在講KNN理論以前,先講下學校時學的兩點間距離公式,即:學習

  

           注: 這是2維座標系裏,求兩點距離測試

   1、KNN理論ui

  首先咱們有兩個數據集,訓練集和測試集,訓練集用來訓練數據,測試集用來測試訓練後的準確性 spa

 

  有了兩點間距離公式,接下來講下KNN步驟:3d

  (1)、首先準備訓練集code

  (2)、準備測試集

  (3)、求測試集和訓練集每點之間的距離

  (4)、按距離升序排序

  (5)、取前K個數據(K通常爲奇數較好),讀取每一個數據的分類結果

  (6)、計算每一個分類出現的次數

  以上是KNN大概步驟,可能光文字描述比較難懂點,其實核心就是兩點間距離公式,下面就用具體的例子說明:

2、首先咱們舉一個電影分類的例子

  首先咱們看下訓練集:

打鬥鏡頭數 接吻鏡頭數 分類結果
1 101 愛情片
 105  1  動做片
2 100 愛情片
100 1 動做片

  訓練集解釋:電影的分類只有兩個類別,即動做片和愛情片,而分類的根據是打鬥鏡頭數和接吻鏡頭數, 若是打鬥鏡頭比接吻鏡頭多,說明是愛情片(你們都懂的),反之則是動做片,這就是分類的規則,但你們有沒有發現一個問題,若是打鬥鏡頭和接吻鏡頭同樣多,那這個分類到底是動做片仍是愛情片了,仍是愛情動做片? 其實這時候用KNN算法是分辨不出來的,由於數據集沒有這個分類

       好了,訓練集準備好了,接下來看下測試集:

打鬥鏡頭數 接吻鏡頭數
130 1
1 100

  以上是實際上是兩個測試集,下面就要分別求出分類結果:

  代碼以下 

 1 import numpy as np;  2 import operator;  3 
 4 def createDataSet():#建立數據集
 5     group=np.array([[1,101],[5,89],[108,5],[115,8]]);#訓練集特徵
 6     labels=np.array(['愛情片','愛情片','動做片','動做片']);#訓練對應的結果
 7     return group,labels;  8 
 9 def classisfy0(inx,dataSet,labels,k):#分類函數,即求出分類結果
10     dataSetSize=dataSet.shape[0];#得到訓練集的行數
11     diffMat=np.tile(inx,(dataSetSize,1))-dataSet;#把測試集重複訓練集的行數,而且測試集減去訓練集,即(x1-x2),(y1-y2)
12     sqDiffMat=diffMat**2;#對矩陣每一個元素求平方
13     sqDistance=sqDiffMat.sum(axis=1);#對矩陣按行求和,axis=1即按行求和
14     distance=sqDistance**0.5;#對求和後的矩陣,開方根,即距離公式的開方
15     sortedDistIndices=distance.argsort();#求出來的距離按從小大到排序,而且返回每一個元素的索引,這裏要注意的是:排序後的元素索引不會變,仍是原來的索引,不瞭解的能夠百度下argsort函數
16     classCount={}; 17     for i in range(k):#取前K個值,而且計算出每一個分類出現的次數
18         votelabel=lables[sortedDistIndices[i]]; 19         classCount[votelabel]=classCount.get(votelabel,0)+1; 20     #排序,即按出現次數從大到小排序
21     sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True); 22     return sortedClassCount[0][0];#取第一個元素的分類結果,即出現次數最多的分類就是分類結果
23 
24 if __name__=='__main__': 25     group,lables=createDataSet(); 26     test=[130,1];#測試集1
27     test_class=classisfy0(test,group,lables,3); 28     print('測試集1結果:',test_class); 29     test=[1,100];#測試集2
30     test_class = classisfy0(test, group, lables, 3); 31     print('測試集2結果:',test_class)

 

  運行結果截圖:

  

   以上就是KNN的示例

 

、根據約會數據集計算出約會成功的機率

  前言:你們有沒有想到一個問題,若是個人數據集是多維的,那距離怎麼求了,這就是另外一個公式了,即歐氏距離公式,即:

  

    先講到這裏吧,下篇再講怎麼計算多維度的數據集分類,你們也能夠根據上面電影分類來實現!

   以上都是我看崔大神的博客:https://cuijiahua.com/blog/2017/11/ml_1_knn.html,學習到的,可能有些地方理解有錯誤,歡迎指教!

相關文章
相關標籤/搜索