本文目的
最近這幾天一直在研究如何評估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節




