拜讀大神的系列教程,大神好像姓崔(猜想),大神根據《機器學習實戰》來說解,講的很清楚,讀了大神的博客後,我也把我本身吸取的寫下來,可能有不少錯誤之處,但願拍磚(拍輕點)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,學習到的,可能有些地方理解有錯誤,歡迎指教!