1 K-Means聚類收斂性怎么證明?一定會收斂???
2 聚類中止條件:迭代次數、簇中心變化率、最小平方誤差MSE???
3 聚類初值的選擇,對聚類結果的影響???(K-Means對初值是敏感的)
4 肘部選擇法——確定聚類數K
沒有所謂最好的選擇聚類數的方法,通常是需要根據不同的問題,人工進行選擇的。選擇的時候思考我們運用 K-均值算法聚類的動機是什么,然后選擇能最好服務于該目的標聚類數。當人們在討論,選擇聚類數目的方法時,有一個可能會談及的方法叫作“肘部法則”。關于“肘部法則”,我們所需要做的是改變 K 值,也就是聚類類別數目的總數。我們用一個聚類來運行 K 均值聚類方法。這就意味著,所有的數據都會分到一個聚類里,然后計算成本函數J,K 代表聚類種類。
我們可能會得到一條類似于這樣的曲線。像一個人的肘部。這就是“肘部法則”所做的,讓我們來看這樣一個圖,看起來就好像有一個很清楚的肘在那兒。好像人的手臂,如果你伸出你的胳膊,那么這就是你的肩關節、肘關節、手。這就是“肘部法則”。你會發現這種模式,它的畸變值會迅速下降,從 1 到 2,從 2 到 3 之后,你會在 3 的時候達到一個肘點。在此之后,畸變值就下降的非常慢,看起來就像使用 3 個聚類來進行聚類是正確的,這是因為那個點是曲線的肘點,畸變值下降得很快,K 等于 3 之后就下降得很慢,那么我們就選 K 等于 3。當你應用“肘部法則”的時候,如果你得到了一個像上面這樣的圖,那么這將是一種用來選擇聚類個數的合理方法。
uk是第k 個類的重心位置。成本函數是各個類畸變程度(distortions)之和。每個類的畸變程度等于該類重心與其內部成員位置距離的平方和。若類內部的成員彼此間越緊湊則類的畸變程度越小,反之,若類內部的成員彼此間越分散則類的畸變程度越大。求解成本函數最小化的參數就是一個重復配置每個類包含的觀測值,并不斷移動類重心的過程。
importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansfromscipy.spatial.distanceimportcdistx = np.array([1,2,3,1,5,6,5,5,6,7,8,9,7,9])y = np.array([1,3,2,2,8,6,7,6,7,1,2,1,1,3])data = np.array(list(zip(x, y)))# 肘部法則 求解最佳分類數# K-Means參數的最優解也是以成本函數最小化為目標# 成本函數是各個類畸變程度(distortions)之和。每個類的畸變程度等于該類重心與其內部成員位置距離的平方和# 畫肘部圖aa=[]K = range(1,10)forkinrange(1,10):? ? kmeans=KMeans(n_clusters=k)? ? kmeans.fit(data)? ? aa.append(sum(np.min(cdist(data, kmeans.cluster_centers_,'euclidean'),axis=1))/data.shape[0])plt.figure()plt.plot(np.array(K), aa,'bx-')plt.show()# 繪制散點圖及聚類結果中心點plt.figure()plt.axis([0,10,0,10])plt.grid(True)plt.plot(x, y,'k.')kmeans = KMeans(n_clusters=3)kmeans.fit(data)plt.plot(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1],'r.')plt.show()
5 K-Means優缺點及適用范圍
K值需要預先給定,屬于預先知識,很多情況下K值的估計是非常困難的,對于像計算全部微信用戶的交往圈這樣的場景就完全的沒辦法用K-Means進行。對于可以確定K值不會太大但不明確精確的K值的場景,可以進行迭代運算,然后找出Cost Function最小時所對應的K值,這個值往往能較好的描述有多少個簇類。
K-Means算法對初始選取的聚類中心點是敏感的,不同的隨機種子點得到的聚類結果完全不同
K-Means算法并不是適用所有的樣本類型。它不能處理非球形簇、不同尺寸和不同密度的簇。
K-Means算法對離群點的數據進行聚類時,K均值也有問題,這種情況下,離群點檢測和刪除有很大的幫助。(異常值對聚類中心影響很大,需要離群點檢測和剔除)
5.K-Means算法對噪聲和離群點敏感,最重要是結果不一定是全局最優,只能保證局部最優。
6 從K-Means 到 Gaussian Mixture Model
數據表示
在 k-means 中,我們用單個點來對 cluster 進行建模,這實際上是一種最簡化的數據建模形式。這種用點來對 cluster 進行建模實際上就已經假設了各 cluster 的數據是呈圓形(或者高維球形)分布的。但在實際生活中,很少能有這種情況。所以在 GMM 中,我們使用一種更加一般的數據表示,也就是高斯分布。
數據先驗
在 k-means 中,我們假設各個 cluster 的先驗概率是一樣的,但是各個 cluster 的數據量可能是不均勻的。舉個例子,cluster A 中包含了10000個樣本,cluster B 中只包含了100個。那么對于一個新的樣本,在不考慮其與 A B cluster 相似度的情況,其屬于 cluster A 的概率肯定是要大于 cluster B的。在 GMM 中,同樣對數據先驗進行了建模。
相似度衡量
在 k-means 中,我們通常采用歐氏距離來衡量樣本與各個 cluster 的相似度。這種距離實際上假設了數據的各個維度對于相似度的衡量作用是一樣的。但在 GMM 中,相似度的衡量使用的是后驗概率
通過引入協方差矩陣,我們就可以對各維度數據的不同重要性進行建模。
數據分配
在 k-means 中,各個樣本點只屬于與其相似度最高的那個cluster,這實際上是一種hard clustering。在 GMM 中則使用的是后驗概率來對各個cluster 按比例分配,是一種 fuzzy clustering。
Hierarchical Clustering與K-Means和GMM這一派系的聚類算法不太相同:
K-Means 與 GMM 更像是一種 top-down 的思想,它們首先要解決的問題是,確定 cluster 數量,也就是 k 的取值。在確定了 k 后,再來進行數據的聚類。
Hierarchical Clustering 則是一種 bottom-up 的形式,先有數據,然后通過不斷選取最相似的數據進行聚類。
K-Means業界用得多的原因之一就是收斂快,現在還能通過分布式計算加速,別的原因有調參就一個K。
作者:7125messi
鏈接:http://www.lxweimin.com/p/cc74c124c00b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。