2019-12-29

K-Means聚類算法

1、原理

第一步:選K個初始聚類中心,z1(1)能庆,z2(1),…祷嘶,zK(1),其中括號內(nèi)的序號為尋找聚類中心的迭代運算的次序號夺溢。聚類中心的向量值可任意設定论巍,例如可選開始的K個模式樣本的向量值作為初始聚類中心。

第二步:逐個將需分類的模式樣本{x}按最小距離準則分配給K個聚類中心中的某一個zj(1)风响。

假設i=j時嘉汰, ,則 钞诡,其中k為迭代運算的次序號郑现,第一次迭代k=1,Sj表示第j個聚類荧降,其聚類中心為zj接箫。

第三步:計算各個聚類中心的新的向量值,zj(k+1)朵诫,j=1,2,…,K

求各聚類域中所包含樣本的均值向量:

其中Nj為第j個聚類域Sj中所包含的樣本個數(shù)辛友。以均值向量作為新的聚類中心,可使如下聚類準則函數(shù)最屑舴怠:

在這一步中要分別計算K個聚類中的樣本均值向量废累,所以稱之為K-均值算法。

第四步:若 脱盲,j=1,2,…,K邑滨,則返回第二步,將模式樣本逐個重新分類钱反,重復迭代運算掖看;

若 ,j=1,2,…,K面哥,則算法收斂哎壳,計算結(jié)束尚卫。

2、程序?qū)崿F(xiàn)

def biKmeans(dataSet, k, distMeas=distEclud):

? ? m = shape(dataSet)[0]

? ? # 這里第一列為類別吱涉,第二列為SSE

? ? clusterAssment = mat(zeros((m,2)))

? ? # 看成一個簇是的質(zhì)心

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

? ? centList =[centroid0] #create a list with one centroid

? ? for j in range(m):? ? #計算只有一個簇是的誤差

? ? ? ? clusterAssment[j,1] = distMeas(mat(centroid0), dataSet[j,:])**2

? ? # 核心代碼

? ? while (len(centList) < k):

? ? ? ? lowestSSE = inf

? ? ? ? # 對于每一個質(zhì)心外里,嘗試的進行劃分

? ? ? ? for i in range(len(centList)):

? ? ? ? ? ? # 得到屬于該質(zhì)心的數(shù)據(jù)

? ? ? ? ? ? ptsInCurrCluster =\ dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]

? ? ? ? ? ? # 對該質(zhì)心劃分成兩類

? ? ? ? ? ? centroidMat, splitClustAss = kMeans(ptsInCurrCluster, 2, distMeas)

? ? ? ? ? ? # 計算該簇劃分后的SSE

? ? ? ? ? ? sseSplit = sum(splitClustAss[:,1])

? ? ? ? ? ? # 沒有參與劃分的簇的SSE

? ? ? ? ? ? sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])

? ? ? ? ? ? print "sseSplit, and notSplit: ",sseSplit,sseNotSplit

? ? ? ? ? ? # 尋找最小的SSE進行劃分

? ? ? ? ? ? # 即對哪一個簇進行劃分后SSE最小

? ? ? ? ? ? if (sseSplit + sseNotSplit) < lowestSSE:

? ? ? ? ? ? ? ? bestCentToSplit = i

? ? ? ? ? ? ? ? bestNewCents = centroidMat

? ? ? ? ? ? ? ? bestClustAss = splitClustAss.copy()

? ? ? ? ? ? ? ? lowestSSE = sseSplit + sseNotSplit

? ? ? ? # 較難理解的部分

? ? ? ? bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList) #change 1 to 3,4, or whatever

? ? ? ? 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]#replace a centroid with two best centroids

? ? ? ? centList.append(bestNewCents[1,:].tolist()[0])

? ? ? ? clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:]= bestClustAss#reassign new clusters, and SSE

? ? return mat(centList), clusterAssment

3、結(jié)論1. K值需要預先給定特石,屬于預先知識级乐,很多情況下K值的估計是非常困難的县匠,對于像計算全部微信用戶的交往圈這樣的場景就完全的沒辦法用K-Means進行撒轮。對于可以確定K值不會太大但不明確精確的K值的場景乞旦,可以進行迭代運算,然后找出Cost Function最小時所對應的K值题山,這個值往往能較好的描述有多少個簇類兰粉。

2. K-Means算法對初始選取的聚類中心點是敏感的,不同的隨機種子點得到的聚類結(jié)果完全不同

3. K均值算法并不是很所有的數(shù)據(jù)類型顶瞳。它不能處理非球形簇、不同尺寸和不同密度的簇焰络,銀冠指定足夠大的簇的個數(shù)是他通常可以發(fā)現(xiàn)純子簇闪彼。

4. 對離群點的數(shù)據(jù)進行聚類時协饲,K均值也有問題畏腕,這種情況下茉稠,離群點檢測和刪除有很大的幫助。


參考文獻:https://blog.csdn.net/taoyanqi8932/article/details/53727841

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末而线,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子况凉,更是在濱河造成了極大的恐慌,老刑警劉巖刁绒,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烤黍,死亡現(xiàn)場離奇詭異傻盟,居然都是意外死亡嫂丙,警方通過查閱死者的電腦和手機娘赴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門诽表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人竿奏,你說我怎么就攤上這事⌒确牛” “怎么了泛啸?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵秃症,是天一觀的道長。 經(jīng)常有香客問我岗仑,道長,這世上最難降的妖魔是什么赔蒲? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任良漱,我火速辦了婚禮,結(jié)果婚禮上母市,老公的妹妹穿的比我還像新娘。我一直安慰自己椅寺,他們只是感情好蒋失,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荆萤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪链韭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天踊谋,我揣著相機與錄音旋讹,去河邊找鬼殖蚕。 笑死沉迹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的胚股。 我是一名探鬼主播裙秋,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼进宝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起党晋,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤徐块,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后胡控,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡庇绽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年橙困,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡傅。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖上陕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情释簿,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布煮纵,位于F島的核電站,受9級特大地震影響行疏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酿联,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一夺巩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柳譬,春花似錦、人聲如沸美澳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至江咳,卻和暖如春哥放,著一層夾襖步出監(jiān)牢的瞬間歼指,已是汗流浹背甥雕。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留社露,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓附鸽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坷备。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • javaSE java程序結(jié)構 Java源程序一般由一個或多個編譯單元組成赌蔑,每個編譯單元只能包含以下內(nèi)容(空格和注...
    西沉_閱讀 376評論 0 0
  • 1.環(huán)境 python 3.7 2.安裝指導竟秫,缺少對nccl的安裝指導 https://github.com/op...
    Joyner2018閱讀 907評論 0 0
  • 《我,鉛筆的故事》 作者:倫納德 里德 翻譯:秋風 本文原題《I,Pencil》趾浅,刊于經(jīng)濟教育基金會(the Fo...
    十八子睿閱讀 300評論 0 0
  • 數(shù)的分類 目前為我們所學過自然數(shù)小數(shù)和分數(shù)馒稍,那么如果要將它分為兩大類皿哨,應該是分成哪兩大類呢筷黔?首先分類標準是不重不漏...
    山海不是小學生閱讀 117評論 0 0
  • 一 2016年7月的一個中午挨决,急救中心接到電話,一位女性稱脖祈,家人突發(fā)昏迷,不知生死盖高。我看著剛打好的飯菜,忍不住抱怨...
    真實故事計劃閱讀 734評論 3 8