????????我們談及數(shù)據(jù)挖掘,無非是“分類”,“關(guān)聯(lián)”,“聚類”,“異常值檢驗”等。今天我想聊聊對聚類的認識,以及基于密度聚類下生成的初始化簇心與K-Means的結(jié)合。
? ? ? ?不同的聚類算法有不同的應(yīng)用場景,適合不同分布、不同屬性、不同數(shù)量級的數(shù)據(jù)集,從這個角度就意味著聚類算法可以進行各種各樣的變形和改進。Mean-Shift算法能根據(jù)數(shù)據(jù)自身的密度分布,自動學習到類的數(shù)目,但類別數(shù)目不一定是我們想要的。而K-Means對噪聲的魯棒性沒有Mean-Shift強,且Mean-Shift是一個單參數(shù)算法,容易作為一個模塊和別的算法集成。因此我在這里,將Mean-Shift聚類后的質(zhì)心作為K-Means的初始中心進行聚類。下圖是Mean-Shift和K-Means結(jié)合的步驟。
? ? ? ?對于非監(jiān)督降維算法,可以參考網(wǎng)址(1)。那降多少維呢?如果不多,性能提升不大;如果目標維度太小,則又丟失了很多信息。我在這里選取了99%的主成分貢獻度作為標準,來選擇目標維度大小。除了PCA線性方法外,對于非線性數(shù)據(jù)集,sklearn也有改進的Kernel PCA。除了PCA外,還有就是Feature Agglomeration的降維方法,直接對特征進行聚類,從而起到降維效果。關(guān)于降維在聚類中的應(yīng)用,感覺譜聚類(Spectral Clustering)效果較好。簡單的說,就是構(gòu)建拉普拉斯矩陣,并歸一化,再進行特征分解,最后用K-Means對最小的N個特征向量進行聚類。?
????? ?在代碼實驗中,單獨用Mean-Shift以及根據(jù)Silhouette評分自動選擇k值的K-Means在聚類結(jié)果上幾乎一樣。
用Mean-Shift結(jié)合K-Means的效果如下。左一圖表示,在沒設(shè)定最終聚類個數(shù)下,MSK認為聚兩類的Silhouette分數(shù)最高。而中間圖與右一圖表示,分別在人工設(shè)定聚類數(shù)維3和4下的聚類效果。實驗代碼放在Github上,參考網(wǎng)址(2)。
參考網(wǎng)址:
(1) http://scikit-learn.org/stable/modules/unsupervised_reduction.html
(2) https://github.com/DemonDamon/meanshift-kmeans-cluster