數據挖掘學習08 - 實驗:使用R評估kmeans聚類的最優K


本文目的

最近這幾天一直在研究如何評估Kmeans聚類算法中的最優K值。主要理論依據是《數據挖掘導論》8.5.5節中介紹的SSE和Silhouette Coefficient系數的方法評估最優K。現在記錄整個實驗過程,作為備忘。不過,體驗過程中,由於R軟件使用的還不太熟練,實現過程中有些地方可能不准確,還請大牛指點。

實驗步驟概述

  1. 下載實驗數據,點擊這里
  2. 取k值范圍,計算出SSE,並繪制出曲線圖,觀察規律
  3. 取步驟2同樣的范圍,計算出Silhouette Coefficient,並繪制出曲線圖,觀察規律
  4. 根據步驟2,3觀察的規律,評估出最優K值
  5. 驗證最優聚類

步驟1:下載實驗數據

按照上面給出的鏈接,下載解壓后的數據如下所示:

image

數據代表的是一些文本的特征矩陣,第一行是代表的詞語,出於保密原因,詞語被轉義了。每一行代表一個文本。第二行開始的第一列是文本的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曲線,如下所示:

image

步驟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具有一定的差異造成的。

 image

 

 

步驟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”)

輸出圖像如下所示

image

 

實驗感受

上述面描述的實驗過程,大致與《數據挖掘導論》8.5.5節中的一致。通過實驗,發現的確可以通過Silhouette Coefficient評估最優K值,但是如何將此評估過程自動化,這還有待進一步研究。最后,也希望高人可以指出kmeans的最佳實踐。

 

參考資料

《數據挖掘導論》(by Pang-Ning Tan) 8.5.5節

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM