機器學習:Python實現聚類算法之K-Means

Python 機器學習 編程語言 大數據 中國統計網 2017-06-13

機器學習:Python實現聚類算法之K-Means

1.簡介

K-means算法是最為經典的基於劃分的聚類方法,是十大經典數據挖掘算法之一。

K-means算法的基本思想是:以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。

2. 算法大致流程為:

1)隨機選取k個點作為種子點(這k個點不一定屬於數據集)

2)分別計算每個數據點到k個種子點的距離,離哪個種子點最近,就屬於哪類

3)重新計算k個種子點的座標(簡單常用的方法是求座標值的平均值作為新的座標值)

4)重複2、3步,直到種子點座標不變或者循環次數完成

3.完整計算過程

1)設置實驗數據

運行之後,效果如下圖所示:

機器學習:Python實現聚類算法之K-Means

在圖中,ABCDE五個點是待分類點,k1、k2是兩個種子點。

2)計算ABCDE五個點到k1、k2的距離,離哪個點近,就屬於哪個點,進行初步分類。

結果如圖:

機器學習:Python實現聚類算法之K-Means

A、B屬於k1,C、D、E屬於k2

3)重新計算k1、k2的座標。這裡使用簡單的座標的平均值,使用其他算法也可以(例如以下三個公式)

a)Minkowski Distance公式——λ可以隨意取值,可以是負數,也可以是正數,或是無窮大。

b)Euclidean Distance公式——也就是第一個公式λ=2的情況

c)CityBlock Distance公式——也就是第一個公式λ=1的情況

採用座標平均值算法的結果如圖:

4)重複2、3步,直到最終分類完畢。下面是完整的示例代碼:

import numpy as np

最終分類結果:

由上圖可以看出,C點最終是屬於k1類,而不是開始的k2.

機器學習:Python實現聚類算法之K-Means

4.K-Means的不足

K-Means算法的不足,都是由初始值引起的:

1)初始分類數目k值很難估計,不確定應該分成多少類才最合適(ISODATA算法通過類的自動合併和分裂,得到較為合理的類型數目k。這裡不講這個算法)

2)不同的隨機種子會得到完全不同的結果(K-Means++算法可以用來解決這個問題,其可以有效地選擇初始點)

算法流程如下:

1)在數據集中隨機挑選1個點作為種子點

##隨機挑選一個數據點作為種子點

2)計算剩數據點到這個點的距離d(x),並且加入到列表

##計算數據點到種子點的距離

3)再取一個隨機值。這次的選擇思路是:先取一個能落在上步計算的距離列表求和後(sum(dis_list))的隨機值rom,然後用rom -= d(x),直到rom<=0,此時的點就是下一個“種子點”

##隨機挑選另外的種子點

4)重複第2步和第3步,直到選出k個種子

5)進行標準的K-Means算法。下面完整代碼

import numpy as np

如圖所示,選擇了A、E兩點作為種子點。

機器學習:Python實現聚類算法之K-Means

最終的結果。

補充說明:因為數據量太少,在選取所有種子函數的while階段有可能陷入死循環,所以需要關閉代碼重新運行才可以出結果。

機器學習:Python實現聚類算法之K-Means

6.sklearn包中的K-Means算法

1)函數:sklearn.cluster.KMeans

2)主要參數

n_clusters:要進行的分類的個數,即上文中k值,默認是8

max_iter :最大迭代次數。默認300

min_iter :最小迭代次數,默認10

init:有三個可選項

‘k-means ++’:使用k-means++算法,默認選項

‘random’:從初始質心數據中隨機選擇k個觀察值

第三個是數組形式的參數

n_jobs: 設置並行量 (-1表示使用所有CPU)

3)主要屬性:

cluster_centers_ :集群中心的座標

labels_ : 每個點的標籤

4)官網示例:

>>> from sklearn.cluster import KMeans

End.

來自:燈塔大數據

國統計網,是國內最早的大數據學習網站,歡迎關注!

機器學習:Python實現聚類算法之K-Means

相關推薦

推薦中...