本文目的
最近這幾天一直在研究如何評估Kmeans聚類算法中的最優K值。主要理論依據是《數據挖掘導論》8.5.5節中介紹的SSE和Silhouette Coefficient系數的方法評估最優K。現在記錄整個實驗過程,作為備忘。不過,體驗過程中,由於R軟件使用的還不太熟練,實現過程中有些地方可能不准確,還請大牛指點。
實驗步驟概述
- 下載實驗數據,點擊這里。
- 取k值范圍,計算出SSE,並繪制出曲線圖,觀察規律
- 取步驟2同樣的范圍,計算出Silhouette Coefficient,並繪制出曲線圖,觀察規律
- 根據步驟2,3觀察的規律,評估出最優K值
- 驗證最優聚類
步驟1:下載實驗數據
按照上面給出的鏈接,下載解壓后的數據如下所示:
數據代表的是一些文本的特征矩陣,第一行是代表的詞語,出於保密原因,詞語被轉義了。每一行代表一個文本。第二行開始的第一列是文本的ID。所以,上圖中紅框中的部分才是文本的特征矩陣。矩陣中每個元素的值代表所在文本當前詞語的詞頻。
步驟2:計算SSE
主要采用R軟件計算不同K值的SSE,R腳本如下:
# 開始與結果邊界 begin = 1; length = 15; count = 50; end = begin + length - 1; # 結果容器 result = c(); result[begin:end] = 0; # 遍歷計算kmeans的SSE qc = read.table("d:/question_cluster.txt", header=T); for(i in begin:end) { # 計算SSE tmp = c(); tmp[1:count] = 0; for(j in 1:count) { kcluster = kmeans(qc, i); tmp[j] = kcluster$tot.withinss; } result[i] = mean(tmp); } # 繪制結果 plot(result, type="o", xlab="Number of Cluster", ylab="Sum of Squer Error");
此腳本按照K從1到15,計算不同的聚類的SSE,由於kmeans算法中的隨機因數,每次結果都不一樣,為了減少時間結果的偶然性,對於每個k值,都重復運行50次,求出平均的SSE,最后繪制出SSE曲線,如下所示:
步驟3:計算Silhouette Coefficient
仍然采用R腳本計算,腳本如下:
# 開始與結果邊界 begin = 2; length = 15; count = 50; end = begin + length - 1; # 結果容器 result = c(); result[begin:end] = -1; # 遍歷計算kmeans的SSE library(cluster); qc = read.table("d:/question_cluster.txt", header=T); for(i in begin:end) { # Silhouette coefficient tmp = c(); tmp[1:count] = 0; for(j in 1:count) { kcluster = pam(qc, i); tmp[j] = kcluster$silinfo$avg.width; } result[i] = mean(tmp); } # 繪制結果 plot(result, type="o", xlab="Number of Cluster", ylab="Silhouette Coefficient");
K從2到15(k=1時無法計算),重復執行50次,得到結果如下:
步驟4:估算K值
SSE圖中沒有什么特點,但是充Silhouette Coefficient圖中可以明顯看到K=8與K=9之間有一個巨大的深溝,根據Silhouette Coefficient的定義,值較大時的K較優,所以估算最優K=8為最優點。但是,書上給出的示意圖是可以看到SSE中對應的地方應該改也有一個比較大的特征點,可能是kmeans的實現算法和pam具有一定的差異造成的。
步驟5:驗證最優K
采用如下代碼計算8個聚類的kmeans
qc = read.table("d:/question_cluster.txt", header=T); kc = kmeans(qc, centers=8)
使用下面的代碼將實驗數據從N維空間降低到2維平面,並繪制圖像
eucQcd = dist(qc,method="euclidean") mds = cmdscale(eucQcd) plot(mds, col=kc$cluster, main=”8 clusters”)
輸出圖像如下所示
實驗感受
上述面描述的實驗過程,大致與《數據挖掘導論》8.5.5節中的一致。通過實驗,發現的確可以通過Silhouette Coefficient評估最優K值,但是如何將此評估過程自動化,這還有待進一步研究。最后,也希望高人可以指出kmeans的最佳實踐。
參考資料
《數據挖掘導論》(by Pang-Ning Tan) 8.5.5節