k Means 二分k 均值演算法)

2021-07-10 12:04:09 字數 1930 閱讀 3883

在上一節中我們已經講了k-均值演算法,當時我們選取的質心是隨機選取的,沒有什麼依據,所以聚類的結果很可能出現誤差,為了降低這種誤差的出現我們今天來研究一種優化的k-均值演算法----二分k--均值演算法,看到名稱我們就能明白在每次劃分的時候都是將資料劃分成倆份,直到達到我們要求的聚類數。怎麼來分?選取哪一堆資料來分?需要我們計算,這裡我們引入乙個叫做誤差平方和的指標,這個指標越小就代表所分的資料越準確。在上一節中我們有乙個矩陣來儲存分類後的索引以及到質心的距離。把所有到質心的點的距離求和就是誤差平方和,每次選取誤差平方和最大的那堆資料進行劃分。『

def bikmeans(dataset, k, distmeas=disteclud):

m = shape(dataset)[0]

clusterassment = mat(zeros((m,2)))

centroid0 = mean(dataset, axis=0).tolist()[0]

centlist =[centroid0] #create a list with one centroid

for j in range(m):#calc initial error

clusterassment[j,1] = distmeas(mat(centroid0), dataset[j,:])**2

while (len(centlist) < k):

lowestsse = inf

for i in range(len(centlist)):

ptsincurrcluster = dataset[nonzero(clusterassment[:,0].a==i)[0],:]

centroidmat, splitclustass = kmeans(ptsincurrcluster, 2, distmeas)

ssesplit = sum(splitclustass[:,1])

ssenotsplit = sum(clusterassment[nonzero(clusterassment[:,0].a!=i)[0],1])

print "ssesplit, and notsplit: ",ssesplit,ssenotsplit

if (ssesplit + ssenotsplit) < lowestsse:

bestcenttosplit = i

bestnewcents = centroidmat

bestclustass = splitclustass.copy()

lowestsse = ssesplit + ssenotsplit

bestclustass[nonzero(bestclustass[:,0].a == 1)[0],0] = len(centlist)

bestclustass[nonzero(bestclustass[:,0].a == 0)[0],0] = bestcenttosplit

print 'the bestcenttosplit is: ',bestcenttosplit

print 'the len of bestclustass is: ', len(bestclustass)

centlist[bestcenttosplit] = bestnewcents[0,:].tolist()[0]

clusterassment[nonzero(clusterassment[:,0].a == bestcenttosplit)[0],:]= bestclustass

return mat(centlist), clusterassment

這裡輸入資料同樣是資料集和要聚類的個數以及距離計算函式。首先開始建立乙個初始簇,接著for迴圈計算出距離。進入while迴圈直到劃分出指定個簇。在for迴圈裡嘗試劃分每乙個簇,然後計算每個簇的誤差值,以及剩餘資料的誤差值,如果這兩個誤差之和小於最小誤差就將這個劃分儲存下來,並將這個誤差作為最小誤差。接著就是更新簇的分配結果,直到分配夠指定的簇結束。

K均值演算法(K means)

k均值聚類容易實現,但是可能收斂到區域性最小值,影響k means效果的因素 優 只需要計算資料點與聚類中心的距離,其計算複雜度只有o n 缺 十分依賴於初始給定的聚類數目 同時隨機初始化可能會生成不同的聚類效果,所以它缺乏重複性和連續性。偽 建立k個點作為起始質心 通常是隨機選擇 當任意乙個點的簇...

二分K均值c 實現

二分k均值原理及python實現請見 1 2 python實現 c 基於python的思路寫的 求指點 include include include include include using namespace std typedef vectortuple const int dims 2 c...

K均值 K means 聚類演算法

j.b.macqueen 在 1967 年提出的k means演算法 22 到目前為止用於科學和工業應用的諸多聚類演算法中一種極有影響的技術。它是聚類方法中乙個基本的劃分方法,常常採用誤差平方和準則函式作為聚類準則函式,誤差平方和準則函式定義為 3 1 其中,是類 中資料物件的均值,即 j 1,2,...