Kmeans是最簡單的一種分類算法已卷,其基本思想是基于距離的思想。即一個待分類的東西堂氯,假設(shè)要?dú)w類為A類或者B類,則根據(jù)這個東西離A類和B類哪個距離更近來決定牌废,離A近就是A類咽白,離B近就是B類。當(dāng)然你可能不止只有兩類鸟缕,但n類的情況也是一樣的晶框,離哪個類近就是那類。
以最簡單的二維坐標(biāo)為例子講一下懂从,下面這個圖授段,有四個點(diǎn)[1,1.1], [1,1], [0,0], [0,0.1]
我們可以很合理的認(rèn)為左下角兩個點(diǎn)是一類,叫A類番甩。
右上角的兩個點(diǎn)是一類侵贵,叫B類。
那如果我們這時來了一個點(diǎn)[0.5,0.5]缘薛,如何給這個點(diǎn)分類呢窍育,是A類還是B類呢?有沒有什么衡量的標(biāo)準(zhǔn)呢宴胧?很簡單漱抓,根據(jù)距離就可以了。找出距離這個點(diǎn)最近的k個點(diǎn)恕齐,k個點(diǎn)中A中的點(diǎn)多乞娄,就屬于A類,B中的點(diǎn)多显歧,就屬于B類仪或。
距離計(jì)算,直接是用矩陣減法士骤,然后再平方就行范删。像下面這樣。
如果kmean算法選擇k=3敦间,這最近的三點(diǎn)距離是0.4瓶逃,0.5束铭,0.5廓块。對應(yīng)的分類是B,B契沫,A带猴。B的數(shù)量大于A。說明待分類的點(diǎn)屬于B類懈万。分類完成拴清。
下面是Python的實(shí)現(xiàn)靶病。部分摘自《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》,為了更好看口予,我把他整成一個文件了娄周。
from numpy import *
import operator
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
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize,1)) - dataSet ##矩陣相減
sqDiffMat = diffMat**2 ##差值平方
sqDistances = sqDiffMat.sum(axis=1)
sortedDistIndicies = sqDistances.argsort() ##對距離進(jìn)行排序
classCount={} ##新建字典,字典常用于排序
for i in range(k): ##對字典進(jìn)行排序沪停,字典以labal作為key煤辨,數(shù)值為kmean的數(shù)值
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
print("dictionary",sortedClassCount)
return sortedClassCount[0][0]
group,labels=createDataSet()
result=classify0([0.5,0.5], group, labels, 3)
print(result) ##顯示結(jié)果
上面的程序大家可以打一下log,跟蹤一下矩陣的變化木张。
最后打印結(jié)果是,分類為B众辨,字典中B有兩個,A有一個舷礼。說明要分類為B鹃彻。
('dictionary', [('B', 2), ('A', 1)])
B