機器學習-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
今天只是講一下原理和基本思路
有時間會解析一下程式碼