數據挖掘學習05 - 使用R對文本進行hierarchical cluster並驗證結果


本文目的

最近一直在使用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);

截圖如下:

Image

cd是一個特征舉證,每一行是文檔的id和此文檔的特征向量,代表一個文本,列代表的是詞語,這里用wN代替。

 

步驟二:計算文本之間的距離矩陣。距離矩陣用作度量聚類之間的相近程度。常用的距離公式有歐式距離,manhattan距離。計算方法如下:

cds = dist(cd, method="euclidean")
attributes(cds)

截圖如下:

image

 

步驟三:計算層級聚類。常用的聚類方式有三種,single,complete和average。

  • single: 兩個聚類之間最近的點作為聚類的距離
  • complete:兩個聚類之間最遠的點作為聚類的距離
  • average:將聚類中的所有向量之和的平局向量作為聚類中心點,中心點最近的聚合成一類。

averge聚類的效果介於single和complte之間,如下面命令,

cave = hclust(cds, method="average")
plot(cave,hang=-1)

下面聚類后的依賴樹:

image

 

步驟四:驗證聚類。層級聚類采用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)

結果如下:

image


采用余弦定理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)

image

計算距離方法與上面一樣,只是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=" ")); 
     } 
}

運行結果如下:

image


實驗總結

實驗過程中,發現距離公司相同的情況下,average的評測結果一般是最好的。不同距離公式的同一種聚類方式沒有比較意義,比如即使euclidean的average方式比manhattan的average的驗證結果低,但是並不意味前者的聚類結果比后者差,因為聚類評測都是根據統一中方法的距離公司計算相關系數,所以沒有比較性。



相關資料


免責聲明!

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



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