之前介紹到的一些機(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 均值算法的一般步驟是:
- 確定K 值是多少:
- 對(duì)于K 值的選擇车柠,可以通過分析數(shù)據(jù)剔氏,估算數(shù)據(jù)應(yīng)該分為幾個(gè)類塑猖。
- 如果無法估計(jì)確切值,可以多試幾個(gè)K 值谈跛,最終將劃分效果最好的K 值作為最終選擇羊苟。
- 選擇K 個(gè)中心點(diǎn):一般最開始的K 個(gè)中心點(diǎn)是隨機(jī)選擇的。
- 將數(shù)據(jù)集中的所有數(shù)據(jù)感憾,通過與中心點(diǎn)的相似度劃分到不同的類別中蜡励。
- 根據(jù)類別中的數(shù)據(jù)平均值,重新計(jì)算每個(gè)類別中心點(diǎn)的位置阻桅。
- 循環(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 的值吠式。
-
algorithm:k-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)行文本分類