一、層次聚類
1 層次聚類的基本概念
層次聚類方法是古老而且常用的聚類方法。層次聚類方法又有兩種産生層次聚類的基本方法。
- 凝聚的:該方法是自底向上的方法,初始每個對象看做一個簇,每一步合并最相近的簇,最終形成一個簇。
- 分類的:該方法是自頂向下的方法,從包含的所有點的簇開始,每一步分裂一個簇,知道僅剩下單點的簇。
本文主要關注凝聚的層次聚類方法。
2 簇之間的鄰近性
在凝聚的層次聚類方法中,需要定義簇之間的相近性。有許多凝聚層次的聚類技術,本文中介紹單鍊、全鍊、組平均。
單鍊:
該方法中兩個簇的鄰近度定義為兩個不同簇中任意兩點之間的最短距離。單鍊技術擅長處理非橢圓形的簇,但是對噪音和離群點很敏感。
兩個簇之間的相似度計算公式為:
dist({m1,m2},{m3,m4})=min(dist(m1,m3),dist(m1,m4),dist(m2,m3),dist(m2,m4))
全鍊:
該方法中兩個簇的鄰近度定義為兩個不同簇中任意兩點之間的最長距離。單鍊技術擅長處理圓形的簇,但是對噪音和離群點不太敏感。
兩個簇之間的相似度計算公式為:
dist({m1,m2},{m3,m4})=max(dist(m1,m3),dist(m1,m4),dist(m2,m3),dist(m2,m4))
組平均:
該方法中兩個簇的鄰近度定義為兩個不同簇中任意兩點之間的平均距離。該方法是位于單鍊和全鍊之間的這種方法。
兩個簇之間的相似度計算公式為:
dist({m1,m2},{m3,m4})=(dist(m1,m3)+dist(m1,m4)+dist(m2,m3)+dist(m2,m4))/4
二、Orange中的層次聚類
使用腳本
以iris資料為例
import Orange
#加載資料
data = Orange.data.Table("iris")
#層次聚類,其中預設采用組平均計算簇之間的相似度
root = Orange.clustering.hierarchical.clustering(data)
labels = [str(d.get_class()) for d in data]
#生成圖像hclust-dendrogram.png
Orange.clustering.hierarchical.dendrogram_draw("hclust-dendrogram.png", root, labels=labels)
生成的圖像如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxITNz8FM1QTO3cjN1MTMvwVOy8CXyEjMxAjMvw1ckF2bsBXdvwFdl5mLuR2cj5Set1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
使用可視化工具
Orange更強大的部分,還支援用控件的方式來進行資料挖掘,同上例的可視化挖掘方法如下:
同樣輸出的結果如下:
無論是用代碼,還是用可視化的方式都可以對參數進行精确的控制。
三、參考資料
資料挖掘導論 http://book.douban.com/subject/5377669/