k-近鄰算法——電影類型分類

k-近鄰算法採用測量不同特徵值之間的距離方法進行分類,它的工作原理很好理解。

簡單來說就是離x最近的k個點決定了x歸爲哪一類。
具體點說:

1.假設有一一個帶有標籤的樣本數據集(訓練樣本集) ,其中包含每條數據與所屬分類的對應關係。
2.輸入沒有標籤的新數據後,將新數據的每個特徵與樣本集中數據對應的特徵進行比較。

  • i.計算新數據與樣本數據集中每條數據的距離。
  • il.對求得的所有距離進行排序(從小到大, 越小表示越相似)。
  • il.取前k (k一般小於等於20)個樣本數據對應的分類標籤。

3.求k個數據中出現次數最多的分類標籤作爲新數據的分類。

通過一個簡單的電影類型分類體會k-近鄰算法的工作流程

1.先導入模塊和數據,一共七組數據。

from numpy import *
import operator

def createDataSet(): #創建二維數據特徵和標籤
    group = array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2],[18,90]])
    labels = ['愛情片','愛情片','愛情片','動作片','動作片','動作片','未知']
    return group,labels

2.用knn算法,爲每組數據分類,即生成一個分類器。Classify0()函數有四個參數:輸入測試集inX、訓練集dataSet、分類標籤labels,參數k

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]   #獲取數據集dataSet的行數
    diffMat = tile(inX, (dataSetSize, 1))- dataSet   #在列向量方向上重複inX共1次(橫向),行向量方向上重複inX共dataSetSize次(縱向)
    sqDiffMat = diffMat**2      #二維特徵相減後平方
    sqDistances = sqDiffMat.sum(axis = 1)    #所有元素相加
    distances = sqDistances**0.5             #開方,計算距離
    sortedDistIndicices = distances.argsort()   #返回distances中的元素從小到大排序後的索引
    classCount = {}    #定義一個記錄類別次數的字典

    for i in range(k): 
        voteIlabel = labels[sortedDistIndicices[i]]    #前k個類別
        classCount[voteIlabel] = classCount.get(voteIlabel,0 ) + 1   #字典的get()方法,返回指定鍵的值
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)     #排序
        #這裏python3中用items()替換python2中的iteritems()
        #key=operator.itemgetter(1)根據字典的值進行排序
        #key=operator.itemgetter(0)根據字典的鍵進行排序
        #reverse降序排序字典
    return sortedClassCount[0][0]  #返回次數最多的類別

距離計算:採用的是歐式距離公式
在這裏插入圖片描述
3. 測試結果

if __name__=="__main__":

    #訓練集
    group,labels = createDataSet()
    print(group)
    print(labels)

    #測試集
    test = [100,20]
    test_class = classify0(test, group, labels, 3)
    print(test_class)

輸出結果證明點(100,20)被分爲動作片:

[[  3 104]
 [  2 100]
 [  1  81]
 [101  10]
 [ 99   5]
 [ 98   2]
 [ 18  90]]
['愛情片', '愛情片', '愛情片', '動作片', '動作片', '動作片', '未知']
動作片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章