首頁>技術>

一、knn演算法步驟:

a:有一堆已知結果的資料樣本(訓練集);

b:輸入測試資料集T;

C:計算T與訓練集的每一個數據之間的距離;

d:根據上述計算出的距離進行排序(升序/降序);

e:計算前k個點所在類別的出現頻率;

f:返回前k個點出現頻率最高的類別作為T的預測分類;

在其基礎上需要測試測試集的錯誤率、準確率,以用來判斷我們學習器的效果。對於學習其的效果判斷可以採用PR、ROC來進行判斷。

表1 每部電影的打鬥鏡頭數、接吻鏡頭數以及電影評估型別

根據上述的表格對未知電影的型別進行分類,由knn的演算法步驟計算出他們與未知電影的距離,採用歐式距離,計算所得距離如下表2:

表2 已知電影與未知電影的距離

現在得到樣本集當中所有與未知電影的距離,按照距離進行遞增排序,根據k-近鄰的思想,選擇最近的k個距離,假設k=3,則由上可知三個最靠近的電影依次是He's Not Really into Dudes、Beautiful Woman、California Man。k-近鄰透過按照距離未知電影最近的k部電影的型別決定未知電影的型別,從表一可知這三部電影全部屬於愛情片,故未知電影屬於愛情片。

如果在取得k部電影當中有不同型別的電影,我們採用比例最大的型別作為未知電影的型別。從而,k-近鄰的思想是取距離未知電影最近的電影當中所佔比例最多的型別,所以從數學的思想來說屬於一種逼近思想!

上述電影的分類python程式碼如下:

import numpy as npimport operator"""函式說明:建立資料集Parameters:無Returns:group - 資料集labels - 分類標籤Modify:2020-10-15"""def createDataSet():#6組二維特徵group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])#6組特徵的標籤labels = ['愛情片','愛情片','愛情片','動作片','動作片','動作片']return group, labels"""函式說明:kNN演算法,分類器Parameters:inX - 用於分類的資料(測試集)dataSet - 用於訓練的資料(訓練集)labes - 分類標籤k - kNN演算法引數,選擇距離最小的k個點Returns:sortedClassCount[0][0] - 分類結果Modify:2020-10-15"""def classify0(inX, dataSet, labels, k):#numpy函式shape[0]返回dataSet的行數dataSetSize = dataSet.shape[0]#在列向量方向上重複inX共1次(橫向),行向量方向上重複inX共dataSetSize次(縱向)diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet#二維特徵相減後平方sqDiffMat = diffMat**2#sum()所有元素相加,sum(0)列相加,sum(1)行相加sqDistances = sqDiffMat.sum(axis=1)#開方,計算出距離,定義歐氏距離distances = sqDistances**0.5#返回distances中元素從小到大排序後的索引值sortedDistIndices = distances.argsort()#定一個記錄類別次數的字典classCount = {}for i in range(k):#取出前k個元素的類別voteIlabel = labels[sortedDistIndices[i]]#dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回預設值。#計算類別次數classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#python3中用items()替換python2中的iteritems()#key=operator.itemgetter(1)根據字典的值進行排序#key=operator.itemgetter(0)根據字典的鍵進行排序#reverse降序排序字典sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)#返回次數最多的類別,即所要分類的類別return sortedClassCount[0][0]if __name__ == '__main__':#建立資料集group, labels = createDataSet()#測試集test = [18,90]#kNN分類test_class = classify0(test, group, labels, 3)#列印分類結果print(test_class)

輸出結果:愛情片

你可以根據自己的喜歡改變電影的名稱,注意這裡的距離採用的歐氏距離進行。感興趣的可以採用matlab進行程式設計knn演算法,看兩者之間誰的程式碼更少,可讀性更好!

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • GLib 主事件迴圈機制