1. 程式人生 > >機器學習-k-近鄰演算法python實踐【4】

機器學習-k-近鄰演算法python實踐【4】

寫在最前面:簡單來說,k-近鄰演算法是用來根據不同的特徵進行分類的一種演算法

優點:精度高、對異常值不敏感、無資料輸入假定
缺點:計算複雜度高、空間複雜度高
適用資料範圍:數值型和標稱型

IDE:Pycharm
python版本:3.6
作業系統:macOS Mojave

kNN(k-近鄰演算法)的工作原理是:存在一個樣本資料集合,也稱作訓練樣本集,這個樣本集的每個資料都存在標籤,當我們輸入沒有標籤的資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後通過KNN演算法提取樣本集中特徵最相似(最近鄰)的分類標籤。通常來說,我們取樣本資料集中的錢k個最相似的資料。

下面把這段話解釋一下,假設我們已有的6部電影,其中三部是愛情片,三部是動作片(不是愛情動作片哈),而這6部片子是根據什麼來分類的呢,是根據打鬥鏡頭和接吻鏡頭來分類的,然後我們通過KNN演算法,將一部新的沒有分類的電影的打鬥鏡頭和接吻鏡頭和其他6部已知電影算出距離,這樣我們得到k個距離,取k=3,然後看著三部電影是什麼型別的,我們就知道新的電影是什麼型別的了。

下面舉個栗子:

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group, labels

我們建立了一個數組,我們知道,這是一個4x2的陣列

m,n = shape(group)
print(m,n)
4 2

在這裡插入圖片描述

打點不易啊

x = [1.0,1.0,0.0,0.0]
y = [1.1,1.0,0.0,0.1]
plt.scatter(x,y)# python要用show展現出來圖
plt.annotate(s='A',xy =(1.0,1.1))
plt.annotate(s='A',xy = (1.0,1.0))
plt.annotate(s='B',xy = (0.0,0.0))
plt.annotate(s='B',xy = (0.0,0.1))
plt.show()

下面我們實施kNN演算法

classify0()函式有四個輸入引數
用於分類的輸入向量是inX
輸入的訓練樣本集為dataSet
標籤向量為labels
最後的引數k表示用於選擇最近鄰居的數目,其中,標籤向量的元素數目和矩陣dataSet的行數相同

歐式距離公式:

在這裡插入圖片描述

就是算兩點之間的距離

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize,1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

然後我們把上面的一組資料輸入

classify0([1,7],group,labels,3)

第一個引數可以更換成你想預測的,執行

然後報錯:

AttributeError: 'dict' object has no attribute 'iteritems'

iteritems改成items即可

得出預測結果

A

2018.10.28晚於南京郵電大學三牌樓校區圖4
今天只是講一下原理和基本思路
有時間會解析一下程式碼