04.29 聚類分析之k-means算法(SSE、輪廓分析)

在前面我們介紹過了很多的監督學習算法,分類和迴歸。這篇文章主要介紹無監督算法,通過聚類分析來處理無類標數據。我們事先並不知道數據的正確結果(類標),通過聚類算法來發現和挖掘數據本身的結構信息,對數據進行分簇(分類)。聚類算法的目標是,簇內相似度高,簇間相似度低。有點像LDA降維算法,類內方差最小,類間方差最大。這篇文章主要包括:

1、K-Means算法

2、K-Means++

3、硬聚類和軟聚類

4、聚類算法的性能評價指標

一、K-Means算法

在聚類算法中K-Means算法是一種最流行的、使用最廣泛的一種聚類算法,因為它的易於實現且計算效率也高。聚類算法的應用領域也是非常廣泛的,包括不同類型的文檔分類、音樂、電影、基於用戶購買行為的分類、基於用戶興趣愛好來構建推薦系統等。

K-Means算法的實現步驟,主要分為四個步驟:

1、從樣本集合中隨機抽取k個樣本點作為初始簇的中心。

2、將每個樣本點劃分到距離它最近的中心點所代表的簇中。

3、用各個簇中所有樣本點的中心點代表簇的中心點。

4、重複2和3,直到簇的中心點不變或達到設定的迭代次數或達到設定的容錯範圍。

常用的距離度量標準是歐幾里得距離的平方:

聚類分析之k-means算法(SSE、輪廓分析)

其中x和y表示不同的兩個樣本,n表示樣本的維度(特徵的數量)。基於歐幾里得距離,K-Means算法需要優化的問題就是,使得簇內誤差平方和(within-cluster sum of squared errors,SSE)最小,也叫簇慣性(cluster intertia)。

聚類分析之k-means算法(SSE、輪廓分析)

下面利用sklearn來實現一個k-means算法的應用,使用sklearn的數據集,數據集中包含150個隨機生成的點,樣本點分為三個不同的簇

聚類分析之k-means算法(SSE、輪廓分析)

聚類分析之k-means算法(SSE、輪廓分析)

150個樣本點的分佈如上圖所示。下面使用sklearn內置的KMeans算法來實現對上面樣本點的聚類分析

聚類分析之k-means算法(SSE、輪廓分析)

二、K-Means++

K-Means算法需要隨機選擇初始化的中心點,如果中心點選擇不合適,可能會導致簇的效果不好或產生收斂速度慢等問題。解決這個問題一個比較合適的方法就是,在數據集上多次運行K-Means算法,根據簇內誤差平方和(SSE)來選擇性能最好的模型。除此之外,還可以通過K-Means++算法,讓初始的中心點彼此的距離儘可能的遠,相比K-Means算法,它能夠產生更好的模型。

K-Means++有下面幾個步驟組成:

1、初始化一個空的集合M,用於存儲選定的k箇中心點

2、從輸入的樣本中隨機選擇第一個中心點μ,並將其加入到集合M中

3、對於集合M之外的任意樣本點x,通過計算找到與其距離最小的樣本d(x,M)

4、使用加權概率分佈來隨機來隨機選擇下一個中心點μ

5、重複步驟2和3,直到選定k箇中心點

6、基於選定的中心點執行k-means算法

使用sklearn來實現K-Means++,只需要將init參數設置為"k-means++",默認設置是"k-means++"。下面利用k-means++算法來實現上面三個簇的聚類

聚類分析之k-means算法(SSE、輪廓分析)

聚類分析之k-means算法(SSE、輪廓分析)

通過上面圖可以發現k-means++的聚類效果還不錯,簇的中心點,基本位於球心。在實際情況中使用k-means++算法可能會遇到,由於樣本的維度太高無法可視化,從而無法設定樣本的簇數。k-means算法的簇不可重疊,也不可分層,並且假定每個簇至少會出現一個樣本。

注意:由於k-means算法是基於歐式距離來計算的,所以k-means算法對於數據的範圍比較敏感,所以在使用k-means算法之前,需要先對數據進行標準化,保證k-means算法不受特徵量綱的影響。

三、硬聚類和軟聚類

硬聚類(hard clustering)是指數據集中的樣本只能劃分到一個簇中,如k-means算法。軟聚類(soft clustering)或模糊聚類(fuzzy clustering)可以將一個樣本劃分到多個不同的簇中,如C-means(FCM)算法。

FCM的計算步驟與k-means相似,只是FCM是使用樣本屬於不同簇的概率來代替k-means中的類標。樣本屬於不同簇的概率之和為1。

FCM的計算步驟如下:

1、指定k箇中心點,並隨機將每個樣本點劃分到某個簇中

2、計算各簇的中心μ

3、更新每個樣本點所屬簇的概率(隸屬度)

4、重複步驟2和3直至,樣本點所屬簇的概率不變或是達到容錯範圍或最大迭代次數

隸屬度的計算公式如下:

聚類分析之k-means算法(SSE、輪廓分析)

其中,ω表示的就是樣本所屬簇的概率,上式表示的簇的個數為3。樣本屬於簇j的概率。m大於1,一般取2,被稱為模糊係數。

FCM算法的單次迭代計算成本要高於k-means算法,但FCM的收斂速度比較快。

四、聚類算法的性能指標

1、簇內誤方差(SSE)

在對簇的劃分中,我們就使用了SSE作為目標函數來劃分簇。當KMeans算法訓練完成後,我們可以通過使用inertia屬性來獲取簇內的誤方差,不需要再次進行計算。

聚類分析之k-means算法(SSE、輪廓分析)

可以使用圖形工具肘方法,根據簇的數量來可視化簇內誤方差。通過圖形可以直觀的觀察到k對於簇內誤方差的影響。

聚類分析之k-means算法(SSE、輪廓分析)

通過上圖可以發現,當簇數量為3的時候出現了肘型,這說明k取3是一個不錯的選擇。

2、輪廓圖定量分析聚類質量

輪廓分析(silhouette analysis),使用圖形工具來度量簇中樣本的聚集程度,除k-means之外也適用於其他的聚類算法。通過三個步驟可以計算出當個樣本的輪廓係數(silhouette coefficient):

1、將樣本x與簇內的其他點之間的平均距離作為簇內的內聚度a

2、將樣本x與最近簇中所有點之間的平均距離看作是與最近簇的分離度b

3、將簇的分離度與簇內聚度之差除以二者中比較大的數得到輪廓係數,計算公式如下

聚類分析之k-means算法(SSE、輪廓分析)

輪廓係數的取值在-1到1之間。當簇內聚度與分度離相等時,輪廓係數為0。當b>>a時,輪廓係數近似取到1,此時模型的性能最佳。

聚類分析之k-means算法(SSE、輪廓分析)

聚類分析之k-means算法(SSE、輪廓分析)

通過輪廓圖,我們能夠看出樣本的簇數以及判斷樣本中是否包含異常值。為了評價聚類模型的性能,可以通過評價輪廓係數,也就是圖中的紅色虛線進行評價。


分享到:


相關文章: