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]]
['愛情片', '愛情片', '愛情片', '動作片', '動作片', '動作片', '未知']
動作片