2019-10-16 機器學(xué)習(xí)-聚類算法-K-means(K-均值聚類)-原理解析-代碼實現(xiàn)(Scikit-learn)

今天我們來看一個非常常見和使用的無監(jiān)督機器學(xué)習(xí)算法——K-均值聚類(K-means)

首先我們先了解一下這個算法的大致背景:

首先要知道什么是聚類

聚是一個將數(shù)據(jù)集中在某些方面相似的數(shù)據(jù)成員進行分類組織的過程既峡,聚類就是一種發(fā)現(xiàn)這種內(nèi)在結(jié)構(gòu)的技術(shù)掏击,聚類技術(shù)經(jīng)常被稱為無監(jiān)督學(xué)習(xí)颠通。

通俗的說蒲牧,就是比如我們?nèi)ズD戏N水稻伟端,水稻田里面有各種各樣的水稻身隐,每株水稻的高低顏色還有其他很多特征都不一樣慎式,我們更具這些特征對水稻進行分類安接,相似的聚為一類。

水稻之間表現(xiàn)有差異

K-均值聚類的定義

給定一個數(shù)據(jù)點集合和需要的聚類數(shù)目k雾家,k由用戶指定铃彰,k均值算法根據(jù)某個距離函數(shù)反復(fù)把數(shù)據(jù)分入k個聚類中

具體什么含義呢?就是我把每個樣本點的數(shù)據(jù)搜集好芯咧,形成了一個數(shù)據(jù)集牙捉,然后我人為地定義一個K竹揍,就是我想聚成K類,那么K-means算法就會根據(jù)我定義的K進行反復(fù)迭代和計算邪铲,最后芬位,我的所有樣本就會被分成K類

圖片來自網(wǎng)絡(luò)

K-means算法的實現(xiàn)

摘自百度百科,我覺的百度百科已經(jīng)說得很清楚了

先隨機選取K個對象作為初始的聚類中心带到。然后計算每個對象與各個種子聚類中心之間的距離昧碉,把每個對象分配給距離它最近的聚類中心。聚類中心以及分配給它們的對象就代表一個聚類揽惹。一旦全部對象都被分配了被饿,每個聚類的聚類中心會根據(jù)聚類中現(xiàn)有的對象被重新計算。這個過程將不斷重復(fù)直到滿足某個終止條件搪搏。終止條件可以是以下任何一個:
Step 1 沒有(或最小數(shù)目)對象被重新分配給不同的聚類
Step 2 沒有(或最小數(shù)目)聚類中心再發(fā)生變化
Step 3 誤差平方和局部最小狭握。

偽代碼

選擇k個點作為初始質(zhì)心。
repeat 將每個點指派到最近的質(zhì)心疯溺,形成k個簇 重新計算每個簇的質(zhì)心
until 質(zhì)心不發(fā)生變化

既然是學(xué)習(xí)最簡單的K-means论颅,就先不講太多的復(fù)雜內(nèi)容,直接上代碼來實戰(zhàn)一下囱嫩。

Scikit-learn - K-means 實戰(zhàn)

首先我先定義一些數(shù)據(jù)恃疯,假設(shè)我在海南種水稻的時候,測量的水稻的株高和劍葉長(數(shù)據(jù)純屬亂扯的哈)墨闲。

from sklearn.cluster import KMeans
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
              [6, 2], [2, 3], [4, 2],
              [8, 1], [4, 5], [5, 3],
              [3, 0], [5, 0], [6, 4],
              [4, 9], [6, 4], [3, 6],
              [5, 4], [9, 7], [2, 4],
              [6, 2], [4, 5], [8, 3]])
X

我們將數(shù)據(jù)輸入這個矩陣中

舉個例子

然后我們大致看一下數(shù)據(jù)的情況

from sklearn.cluster import KMeans
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
              [6, 2], [2, 3], [4, 2],
              [8, 1], [4, 5], [5, 3],
              [3, 0], [5, 0], [6, 4],
              [4, 9], [6, 4], [3, 6],
              [5, 4], [9, 7], [2, 4],
              [6, 2], [4, 5], [8, 3]])
plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='see')   
plt.show()
這個是個二維的數(shù)據(jù)

然后直接用scikit的函數(shù)訓(xùn)練澡谭,這里我們可以設(shè)置 K, 我先設(shè)置成 K=2 的情況

from sklearn.cluster import KMeans
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
              [6, 2], [2, 3], [4, 2],
              [8, 1], [4, 5], [5, 3],
              [3, 0], [5, 0], [6, 4],
              [4, 9], [6, 4], [3, 6],
              [5, 4], [9, 7], [2, 4],
              [6, 2], [4, 5], [8, 3]])

rice_cluster = KMeans(n_clusters=2)  #設(shè)置一個你想分的類別,定義一個聚類器

rice_cluster.fit(X) # 使用這個數(shù)據(jù)進行訓(xùn)練

rice_cluster.labels_  # 我們可以看到每個樣本點的聚類標(biāo)簽

已經(jīng)給出了標(biāo)簽

我們畫圖來看一下結(jié)果

from sklearn.cluster import KMeans
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
              [6, 2], [2, 3], [4, 2],
              [8, 1], [4, 5], [5, 3],
              [3, 0], [5, 0], [6, 4],
              [4, 9], [6, 4], [3, 6],
              [5, 4], [9, 7], [2, 4],
              [6, 2], [4, 5], [8, 3]])

rice_cluster = KMeans(n_clusters=2)  #設(shè)置一個你想分的類別损俭,定義一個聚類器

rice_cluster.fit(X) # 使用這個數(shù)據(jù)進行訓(xùn)練

label = rice_cluster.labels_
x0 = X[label == 0]
x1 = X[label == 1]

plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')  
plt.scatter(x1[:, 0], x1[:, 1], c = "blue", marker='*', label='label1')   
plt.show()  
分成了2類

使用輪子的好處就是你主要調(diào)參就行了蛙奖,接下來我們調(diào)整成3類試試看

from sklearn.cluster import KMeans
import numpy as np
import pandas  as pd
import matplotlib.pyplot as plt
X = np.array([[1, 2], [1, 4], [1, 1],
              [6, 2], [2, 3], [4, 2],
              [8, 1], [4, 5], [5, 3],
              [3, 0], [5, 0], [6, 4],
              [4, 9], [6, 4], [3, 6],
              [5, 4], [9, 7], [2, 4],
              [6, 2], [4, 5], [8, 3]])

rice_cluster = KMeans(n_clusters=3)  #設(shè)置一個你想分的類別,定義一個聚類器

rice_cluster.fit(X) # 使用這個數(shù)據(jù)進行訓(xùn)練

label = rice_cluster.labels_
x0 = X[label == 0]
x1 = X[label == 1]
x2 = X[label == 2]

plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')  
plt.scatter(x1[:, 0], x1[:, 1], c = "blue", marker='*', label='label1')   
plt.scatter(x2[:, 0], x2[:, 1], c = "green", marker='+', label='label2')   
plt.show()  
3類的結(jié)果

用起來不是很難杆兵,關(guān)鍵是我們要懂其內(nèi)在的原理雁仲,同時清楚自己要解決的問題是什么。

評價模型好壞

我們先來看看模型的中心點

rice_cluster.cluster_centers_
這個就是中心點的值

然后可以用已經(jīng)訓(xùn)練好的模型琐脏,去預(yù)測新的值

rice_cluster.predict([[1, 1], [5, 3],[5, 6]])
模型會告訴你屬于哪一類

還有一個評價體系攒砖,評價模型好壞,結(jié)果與1越接近日裙,樣本聚類越合理

from sklearn import metrics
score=metrics.silhouette_score(X,label)
score
score值

K-means 優(yōu)缺點介紹

優(yōu)點:簡單 快捷 如果簇是密集的吹艇,分類效果特別好

缺點:處理符號屬性的數(shù)據(jù)不適用、必須實現(xiàn)給出K值昂拂、對初始值有一定的要求受神,初始值設(shè)定不當(dāng),聚類結(jié)果可能不同格侯、如果有極端值鼻听,會影響平均值

K-means 算法升級

這里就不做多的介紹财著,可以自行搜索scikit-learn聚類
里面有詳細的介紹,我們要根據(jù)自己實際的數(shù)據(jù)情況選擇相應(yīng)的聚類方法撑碴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撑教,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子醉拓,更是在濱河造成了極大的恐慌伟姐,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿卤,死亡現(xiàn)場離奇詭異玫镐,居然都是意外死亡,警方通過查閱死者的電腦和手機怠噪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杜跷,“玉大人傍念,你說我怎么就攤上這事「鹈疲” “怎么了憋槐?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淑趾。 經(jīng)常有香客問我阳仔,道長,這世上最難降的妖魔是什么扣泊? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任近范,我火速辦了婚禮,結(jié)果婚禮上延蟹,老公的妹妹穿的比我還像新娘评矩。我一直安慰自己,他們只是感情好阱飘,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布斥杜。 她就那樣靜靜地躺著,像睡著了一般沥匈。 火紅的嫁衣襯著肌膚如雪蔗喂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天高帖,我揣著相機與錄音缰儿,去河邊找鬼。 笑死散址,一個胖子當(dāng)著我的面吹牛返弹,可吹牛的內(nèi)容都是我干的锈玉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼义起,長吁一口氣:“原來是場噩夢啊……” “哼拉背!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起默终,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤椅棺,失蹤者是張志新(化名)和其女友劉穎茴肥,沒想到半個月后滥玷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弯囊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年含滴,在試婚紗的時候發(fā)現(xiàn)自己被綠了诱渤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谈况,死狀恐怖勺美,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碑韵,我是刑警寧澤赡茸,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站祝闻,受9級特大地震影響占卧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜联喘,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一华蜒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豁遭,春花似錦友多、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜈抓,卻和暖如春启绰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沟使。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工委可, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓着倾,卻偏偏與公主長得像拾酝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子卡者,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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