公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml
以前介紹到的一些機器學習算法都是監督學習算法。所謂監督學習,就是既有特徵數據,又有目標數據。python
而本篇文章要介紹的K 均值算法是一種無監督學習。git
與分類算法相比,無監督學習算法又叫聚類算法,就是隻有特徵數據,沒有目標數據,讓算法自動從數據中「學習知識」,將不一樣類別的數據彙集到相應的類別中。github
K 均值的英文爲K-Means,其含義是:算法
K 均值算法能夠將一個沒有被分類的數據集,劃分到K 個類中。某個數據應該被劃分到哪一個類,是經過該數據與羣組中心點的類似度決定的,也就是該數據與哪一個類的中心點最類似,則該數據就應該被劃分到哪一個類中。shell
關於如何計算事物之間的類似度,能夠參考文章《計算機如何理解事物的相關性》。dom
使用K 均值算法的通常步驟是:機器學習
K 均值算法是一個聚類算法,sklearn 庫中的 cluster 模塊實現了一系列的聚類算法,其中就包括K 均值算法。學習
來看下KMeans 類的原型:code
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 類有不少參數,這裏介紹幾個比較重要的參數:
下面對一些二維座標中的點進行聚類,看下如何使用K 均值算法。
下面是隨機生成的三類座標點,每類有20 個點,不一樣類的點的座標在不一樣的範圍內:
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 將這些點畫在二維座標中,代碼以下:
import matplotlib.pyplot as plt plt.scatter(Ax + Bx + Cx, Ay + By + Cy, marker='o') plt.show()
畫出來的圖以下,可看到這三類點的分佈範圍仍是一目瞭然的。
關於如何使用 Matplotlib 繪圖,能夠參考文章《如何使用Python 進行數據可視化》。
下面使用K 均值算法對數據點進行聚類。
建立K 均值模型對象:
from sklearn.cluster import KMeans # 設置 K 值爲 3,其它參數使用默認值 kmeans = KMeans(n_clusters=3)
準備數據,共三大類,60 個座標點:
train_data = [ # 前20 個爲 A 類點 [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 個爲B 類點 [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 個爲C 類點 [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)
對數據進行聚類:
predict_data = kmeans.predict(train_data)
查看聚類結果,其中的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]
經過觀察最終的聚類結果predict_data,能夠看到,前,中,後20 個數據分別被分到了不一樣的類中,也很是符合咱們的預期,說明K 均值算法的聚類結果仍是很不錯的 。
由於本例中的二維座標點的分佈界限很是明顯,因此最終的聚類結果很是不錯。
本篇文章主要介紹了K 均值算法的原理,及sklearn 庫對它的實現,而且演示瞭如何使用K 均值算法對二維數據點進行聚類。
(本節完。)
推薦閱讀:
歡迎關注做者公衆號,獲取更多技術乾貨。