K 均值算法-如何讓數(shù)據(jù)自動(dòng)分組

之前介紹到的一些機(jī)器學(xué)習(xí)算法都是監(jiān)督學(xué)習(xí)算法闰围。所謂監(jiān)督學(xué)習(xí)消恍,就是既有特征數(shù)據(jù),又有目標(biāo)數(shù)據(jù)豺总。

而本篇文章要介紹的K 均值算法是一種無監(jiān)督學(xué)習(xí)车伞。

與分類算法相比,無監(jiān)督學(xué)習(xí)算法又叫聚類算法喻喳,就是只有特征數(shù)據(jù)另玖,沒有目標(biāo)數(shù)據(jù),讓算法自動(dòng)從數(shù)據(jù)中“學(xué)習(xí)知識(shí)”表伦,將不同類別的數(shù)據(jù)聚集到相應(yīng)的類別中谦去。

1,K 均值算法

K 均值的英文為K-Means绑榴,其含義是:

  • K:表示該算法可以將數(shù)據(jù)劃分到K 個(gè)不同的組中哪轿。
  • 均值:表示每個(gè)組的中心點(diǎn)是組內(nèi)所有值的平均值盈魁。

K 均值算法可以將一個(gè)沒有被分類的數(shù)據(jù)集翔怎,劃分到K 個(gè)類中。某個(gè)數(shù)據(jù)應(yīng)該被劃分到哪個(gè)類杨耙,是通過該數(shù)據(jù)與群組中心點(diǎn)相似度決定的赤套,也就是該數(shù)據(jù)與哪個(gè)類的中心點(diǎn)最相似,則該數(shù)據(jù)就應(yīng)該被劃分到哪個(gè)類中珊膜。

關(guān)于如何計(jì)算事物之間的相似度容握,可以參考文章《計(jì)算機(jī)如何理解事物的相關(guān)性》。

使用K 均值算法的一般步驟是:

  1. 確定K 值是多少:
    • 對(duì)于K 值的選擇车柠,可以通過分析數(shù)據(jù)剔氏,估算數(shù)據(jù)應(yīng)該分為幾個(gè)類塑猖。
    • 如果無法估計(jì)確切值,可以多試幾個(gè)K 值谈跛,最終將劃分效果最好的K 值作為最終選擇羊苟。
  2. 選擇K 個(gè)中心點(diǎn):一般最開始的K 個(gè)中心點(diǎn)隨機(jī)選擇的。
  3. 將數(shù)據(jù)集中的所有數(shù)據(jù)感憾,通過與中心點(diǎn)的相似度劃分到不同的類別中蜡励。
  4. 根據(jù)類別中的數(shù)據(jù)平均值,重新計(jì)算每個(gè)類別中心點(diǎn)的位置阻桅。
  5. 循環(huán)迭代第3凉倚,4步,直到中心點(diǎn)的位置幾乎不再改變嫂沉,分類過程就算完畢稽寒。

2,K 均值算法聚類過程

下面以一個(gè)二維數(shù)據(jù)點(diǎn)的聚類過程趟章,來看下K 均值算法如何聚類瓦胎。

首先,這里有一些離散的數(shù)據(jù)點(diǎn)尤揣,如下圖:

我們使用K 均值算法對(duì)這些數(shù)據(jù)點(diǎn)進(jìn)行聚類搔啊。隨機(jī)選擇兩個(gè)點(diǎn)作為兩個(gè)類的中心點(diǎn),分別是紅色x藍(lán)色x

計(jì)算所有數(shù)據(jù)點(diǎn)到這兩個(gè)中心點(diǎn)的距離北戏,距離紅色x 近的點(diǎn)標(biāo)紅色负芋,距離藍(lán)色x 近的點(diǎn)標(biāo)藍(lán)色:

重新計(jì)算兩個(gè)中心點(diǎn)的位置,兩個(gè)中心點(diǎn)分別移動(dòng)到新的位置:

重新計(jì)算所有數(shù)據(jù)點(diǎn)分別到紅色x藍(lán)色x的距離嗜愈,距離紅色x 近的點(diǎn)標(biāo)紅色旧蛾,距離藍(lán)色x 近的點(diǎn)標(biāo)藍(lán)色:

再次計(jì)算兩個(gè)中心點(diǎn)的位置,兩個(gè)中心點(diǎn)分別移動(dòng)到新的位置:

直到中心點(diǎn)的位置幾乎不再變化蠕嫁,聚類結(jié)束锨天。

以上過程就是K 均值算法的聚類過程。

3剃毒,K 均值算法的實(shí)現(xiàn)

K 均值算法是一個(gè)聚類算法病袄,sklearn 庫中的 cluster 模塊實(shí)現(xiàn)了一系列的聚類算法,其中就包括K 均值算法赘阀。

來看下KMeans 類的原型:

KMeans(
    n_clusters=8, 
    init='k-means++', 
    n_init=10, 
    max_iter=300, 
    tol=0.0001, 
    precompute_distances='deprecated', 
    verbose=0, 
    random_state=None, 
    copy_x=True, 
    n_jobs='deprecated', 
    algorithm='auto')

可以看KMeans 類有很多參數(shù)益缠,這里介紹幾個(gè)比較重要的參數(shù):

  • n_clusters: 即 K 值,可以隨機(jī)設(shè)置一些 K 值基公,選擇聚類效果最好的作為最終的 K 值幅慌。
  • init:選擇初始中心點(diǎn)的方式:
    • init='k-means++':可加快收斂速度,是默認(rèn)方式轰豆,也是比較好的方式胰伍。
    • init='random ':隨機(jī)選擇中心點(diǎn)齿诞。
    • 也可以自定義方式,這里不多介紹骂租。
  • n_init:初始化中心點(diǎn)的運(yùn)算次數(shù)掌挚,默認(rèn)是 10。如果 K 值比較大菩咨,可以適當(dāng)增大 n_init 的值吠式。
  • algorithmk-means 的實(shí)現(xiàn)算法,有auto抽米,full特占,elkan三種。
    • 默認(rèn)是auto云茸,根據(jù)數(shù)據(jù)的特點(diǎn)自動(dòng)選擇用full或者elkan是目。
  • max_iter:算法的最大迭代次數(shù),默認(rèn)是300标捺。
    • 如果聚類很難收斂懊纳,設(shè)置最大迭代次數(shù)可以讓算法盡快結(jié)束。

下面對(duì)一些二維坐標(biāo)中的點(diǎn)進(jìn)行聚類亡容,看下如何使用K 均值算法嗤疯。

4,準(zhǔn)備數(shù)據(jù)點(diǎn)

下面是隨機(jī)生成的三類坐標(biāo)點(diǎn)闺兢,每類有20 個(gè)點(diǎn)茂缚,不同類的點(diǎn)的坐標(biāo)在不同的范圍內(nèi):

  • A 類點(diǎn):Ax 表示A 類點(diǎn)的橫坐標(biāo),Ay 表示A 類點(diǎn)的縱坐標(biāo)屋谭。橫縱坐標(biāo)范圍都是 (0, 20]脚囊。
  • B 類點(diǎn):Bx 表示B 類點(diǎn)的橫坐標(biāo),By 表示B 類點(diǎn)的縱坐標(biāo)桐磁。橫縱坐標(biāo)范圍都是 (40, 60]悔耘。
  • C 類點(diǎn):Cx 表示C 類點(diǎn)的橫坐標(biāo),Cy 表示C 類點(diǎn)的縱坐標(biāo)我擂。橫縱坐標(biāo)范圍都是 (70, 90]衬以。
Ax = [20, 6, 14, 13, 8, 19, 20, 14, 2, 11, 2, 15, 19, 4, 4, 11, 13, 4, 15, 11]
Ay = [14, 19, 17, 16, 3, 7, 9, 18, 20, 3, 4, 12, 9, 17, 14, 1, 18, 17, 3, 5]

Bx = [53, 50, 46, 52, 57, 42, 47, 55, 56, 57, 56, 50, 46, 46, 44, 44, 58, 54, 47, 57]
By = [60, 57, 57, 53, 54, 45, 54, 57, 49, 53, 42, 59, 54, 53, 50, 50, 58, 58, 58, 51]

Cx = [77, 75, 71, 87, 74, 70, 74, 85, 71, 75, 72, 82, 81, 70, 72, 71, 88, 71, 72, 80]
Cy = [85, 77, 82, 87, 71, 71, 77, 88, 81, 73, 80, 72, 90, 77, 89, 88, 83, 77, 90, 72]

我們可以用 Matplotlib 將這些點(diǎn)畫在二維坐標(biāo)中,代碼如下:

import matplotlib.pyplot as plt

plt.scatter(Ax + Bx + Cx, Ay + By + Cy, marker='o')
plt.show()

畫出來的圖如下扶踊,可看到這三類點(diǎn)的分布范圍還是一目了然的泄鹏。

關(guān)于如何使用 Matplotlib 繪圖郎任,可以參考文章《如何使用Python 進(jìn)行數(shù)據(jù)可視化》秧耗。

5,對(duì)數(shù)據(jù)聚類

下面使用K 均值算法對(duì)數(shù)據(jù)點(diǎn)進(jìn)行聚類舶治。

創(chuàng)建K 均值模型對(duì)象:

from sklearn.cluster import KMeans

# 設(shè)置 K 值為 3分井,其它參數(shù)使用默認(rèn)值
kmeans = KMeans(n_clusters=3)

準(zhǔn)備數(shù)據(jù)车猬,共三大類,60 個(gè)坐標(biāo)點(diǎn):

train_data = [
    # 前20 個(gè)為 A 類點(diǎn)
    [20, 14], [6, 19], [14, 17], [13, 16], [8, 3], [19, 7], [20, 9], 
    [14, 18], [2, 20], [11, 3], [2, 4], [15, 12], [19, 9], [4, 17], 
    [4, 14], [11, 1], [13, 18], [4, 17], [15, 3], [11, 5],

    # 中間20 個(gè)為B 類點(diǎn)
    [53, 60], [50, 57], [46, 57], [52, 53], [57, 54], [42, 45], [47, 54], 
    [55, 57], [56, 49], [57, 53], [56, 42], [50, 59], [46, 54], [46, 53], 
    [44, 50], [44, 50], [58, 58], [54, 58], [47, 58], [57, 51],

    # 最后20 個(gè)為C 類點(diǎn)
    [77, 85], [75, 77], [71, 82], [87, 87], [74, 71], [70, 71], [74, 77], 
    [85, 88], [71, 81], [75, 73], [72, 80], [82, 72], [81, 90], [70, 77], 
    [72, 89], [71, 88], [88, 83], [71, 77], [72, 90], [80, 72],
]

擬合模型:

kmeans.fit(train_data)

對(duì)數(shù)據(jù)進(jìn)行聚類:

predict_data = kmeans.predict(train_data)

查看聚類結(jié)果尺锚,其中的0珠闰,1,2 分別代表不同的類別:

>>> print(predict_data)
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]

通過觀察最終的聚類結(jié)果predict_data瘫辩,可以看到伏嗜,前,中伐厌,后20 個(gè)數(shù)據(jù)分別被分到了不同的類中承绸,也非常符合我們的預(yù)期,說明K 均值算法的聚類結(jié)果還是很不錯(cuò)的 挣轨。

因?yàn)楸纠械亩S坐標(biāo)點(diǎn)的分布界限非常明顯军熏,所以最終的聚類結(jié)果非常不錯(cuò)。

我們可以通過 n_iter_ 屬性來查看迭代的次數(shù):

>>> kmeans.n_iter_
2

通過 cluster_centers_ 屬性查看每個(gè)類的中心點(diǎn)坐標(biāo):

>>> kmeans.cluster_centers_
array([[11.25, 11.3 ],
       [75.9 , 80.5 ],
       [50.85, 53.6 ]])

將這三個(gè)中心點(diǎn)畫在坐標(biāo)軸中卷扮,如下:

6荡澎,總結(jié)

本篇文章主要介紹了K 均值算法的原理,及sklearn 庫對(duì)它的實(shí)現(xiàn)晤锹,并且演示了如何使用K 均值算法對(duì)二維數(shù)據(jù)點(diǎn)進(jìn)行聚類摩幔。

(本節(jié)完。)


推薦閱讀:

如何使用Python 進(jìn)行數(shù)據(jù)可視化

決策樹算法-實(shí)戰(zhàn)篇-鳶尾花及波士頓房?jī)r(jià)預(yù)測(cè)

樸素貝葉斯分類-實(shí)戰(zhàn)篇-如何進(jìn)行文本分類

KNN 算法-實(shí)戰(zhàn)篇-如何識(shí)別手寫數(shù)字

計(jì)算機(jī)如何理解事物的相關(guān)性-文檔的相似度判斷

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鞭铆,一起剝皮案震驚了整個(gè)濱河市热鞍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衔彻,老刑警劉巖薇宠,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艰额,居然都是意外死亡澄港,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門柄沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來回梧,“玉大人,你說我怎么就攤上這事祖搓∮猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵拯欧,是天一觀的道長(zhǎng)详囤。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么藏姐? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任隆箩,我火速辦了婚禮,結(jié)果婚禮上羔杨,老公的妹妹穿的比我還像新娘捌臊。我一直安慰自己,他們只是感情好兜材,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布理澎。 她就那樣靜靜地躺著,像睡著了一般曙寡。 火紅的嫁衣襯著肌膚如雪矾端。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天卵皂,我揣著相機(jī)與錄音秩铆,去河邊找鬼。 笑死灯变,一個(gè)胖子當(dāng)著我的面吹牛殴玛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播添祸,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼滚粟,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了刃泌?” 一聲冷哼從身側(cè)響起凡壤,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耙替,沒想到半個(gè)月后亚侠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俗扇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年硝烂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铜幽。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滞谢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出除抛,到底是詐尸還是另有隱情狮杨,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布到忽,位于F島的核電站橄教,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颤陶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一颗管、第九天 我趴在偏房一處隱蔽的房頂上張望陷遮。 院中可真熱鬧滓走,春花似錦、人聲如沸帽馋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绽族。三九已至姨涡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吧慢,已是汗流浹背涛漂。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留检诗,地道東北人匈仗。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逢慌,于是被迫代替她去往敵國和親悠轩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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