本文目的
最近一直在使用R進行hcluster計算,主要采用了一些R自帶的距離公式和cophenetic距離驗證聚類的質量。其中R自帶的hclust方法不支持cosine函數,如果需要下載R的擴展,要下載許多關聯的庫,所以自己編寫了一個簡單的cosine函數,並且使用了R的proxy擴展(距離計算框架),計算向量距離。內容涉及比較多,所以記錄一下,作為備忘。
采用R計算hclust
步驟一:准備數據。采用read.table函數,讀取外部文件,實驗文件這里下載。
cd = read.table("d:/cluster_data.txt", header = TRUE);
attributes(cd);
截圖如下:
cd是一個特征舉證,每一行是文檔的id和此文檔的特征向量,代表一個文本,列代表的是詞語,這里用wN代替。
步驟二:計算文本之間的距離矩陣。距離矩陣用作度量聚類之間的相近程度。常用的距離公式有歐式距離,manhattan距離。計算方法如下:
cds = dist(cd, method="euclidean") attributes(cds)
截圖如下:
步驟三:計算層級聚類。常用的聚類方式有三種,single,complete和average。
- single: 兩個聚類之間最近的點作為聚類的距離
- complete:兩個聚類之間最遠的點作為聚類的距離
- average:將聚類中的所有向量之和的平局向量作為聚類中心點,中心點最近的聚合成一類。
averge聚類的效果介於single和complte之間,如下面命令,
cave = hclust(cds, method="average") plot(cave,hang=-1)
下面聚類后的依賴樹:
步驟四:驗證聚類。層級聚類采用cophenetic distance用於度量聚類的效果(具體什么是cophenetic disctance可以參見Introduction to Data Mining by Pang-Ning Tan & Michael Steinbach & Vipin Kumar: Chapter 8.5.4)。R提供了此函數的實現,所以可以直接調用cophenetic函數驗證結果,此函數值是介於-1~1之間,越大,說明聚類效果越好。命令如下,
cop = cophenetic(cave) cor(cop, cds)
結果如下:
采用余弦定理cosine計算文本之間的距離
余弦定理可以計算文本向量的相似度,吳軍先生的數學之美系列描述過此應用。但是,上面提到的dist方法不知此余弦公式。嘗試過使用其他擴展中的相關實現,但是無法直接使用。最后找到一個解決方案,使用R擴展庫proxy提供的dist計算框架,然后加入加入自己的cosine的簡單實現,如果添加R擴展,可以參見這里。自定義cosine函數如下:
cosine = function(a,b) {
len = (sqrt(a %*% a)*sqrt(b %*% b));
if (len == 0) {
0;
} else {
(a %*% b)/len;
}
}
(是不是寫法有點像JS)
定義好cosine后,加載proxy庫,
library(proxy)
計算距離方法與上面一樣,只是method的值為cosine,如下
cds = dist(t,method="cosine")
注意,一定要加引號,否則調用的是sine。計算聚類的方式與上面一樣,這里不再重復。
所有距離方法和聚類方法的測試腳本
disFunc = c("euclidean", "maximum", "manhattan" , "canberra", "binary", "minkowski");
#disFunc = c("euclidean", "cosine");
cluFunc = c("complete", "single", "average", "ward", "mcquitty", "median", "centroid");
qc = read.table("d:/cluster_data.txt", header = TRUE);
for (dis in disFunc) {
for (clu in cluFunc) {
qcDis = dist(qc, method=dis);
c = hclust(qcDis, method=clu);
cop = cophenetic(c);
r = cor(cop,qcDis);
print(paste(dis, clu, r, sep=" "));
}
}
運行結果如下:
實驗總結
實驗過程中,發現距離公司相同的情況下,average的評測結果一般是最好的。不同距離公式的同一種聚類方式沒有比較意義,比如即使euclidean的average方式比manhattan的average的驗證結果低,但是並不意味前者的聚類結果比后者差,因為聚類評測都是根據統一中方法的距離公司計算相關系數,所以沒有比較性。
相關資料
- proxy框架與自定義距離函數: http://stackoverflow.com/questions/7482797/how-to-specify-other-method-for-dist-function-in-r
- Cluster Analysis : Toturial with R: http://cc.oulu.fi/~jarioksa/opetus/metodi/sessio3.pdf
- Introduction to Data Mining by Pang-Ning Tan & Michael Steinbach & Vipin Kumar: Chapter 8.5.4
- 數學之美十二 余弦定理和新聞分類: http://www.google.com.hk/ggblog/googlechinablog/2006/07/12_4010.html






