Python中的凝聚層次聚類示例
https://www.toutiao.com/a6641489713536434695/
2019-01-01 19:32:04
層次聚類演算法將相似的物件分組到稱為聚類的組中。層次聚類演算法有兩種:
- 凝聚(Agglomerative )-自下而上的方法。從許多小聚類開始,然後將它們合併到一起,建立更大的聚類。
- 分裂 (Divisive )- 自上而下的方法。從單個聚類開始,而不是將其拆分為更小的聚類。
層次聚類的一些優缺點
優點
- 不假設特定數量的聚類(即k均值)
- 可能對應於有意義的層次關係
缺點
- 一旦決定組合兩個聚類,它就無法撤消
- 遇到大機器學習資料集時太慢,O(2log())
它時如何運作的
1.使每個資料點成為一個聚類
2.取兩個最接近的聚類並使它們成為一個聚類
3.重複步驟2,直到只有一個聚類
樹形圖
我們可以使用樹形圖來顯示分組的歷史,並找出最佳的聚類數。
- 確定不與任何其他聚類相交的最大垂直距離
- 在兩個末端畫一條水平線
- 最佳聚類數等於通過水平線的垂直線數
例如,在下面的例子中,沒有的最佳選擇。叢集將是4。
連線標準(Linkage Criteria)
與梯度下降類似,您可以調整某些引數以獲得截然不同的結果。
連線標準指的是如何計算聚類之間的距離
Single Linkage
兩個聚類之間的距離是每個聚類中兩點之間的最短距離
Complete Linkage
兩個聚類之間的距離是每個聚類中兩點之間的最長距離
Average Linkage
簇之間的距離是一個聚類中每個點與另一個聚類中每個點之間的平均距離
Ward Linkage
聚類之間的距離是所有聚類內的平方差的總和
距離度量
用於計算資料點之間距離的方法將影響最終結果。
歐幾里德距離
兩點之間的最短距離。例如,如果x =(a,b)和y =(c,d),則x和y之間的歐幾里德距離為√((a-c)²+(b-d)²)
曼哈頓距離
想象一下,你在一個大城市的市中心,你想要從A點到達B點。你將無法跨越建築物,而是你必須沿著各條街道行走。例如,如果x =(a,b)和y =(c,d),則x和y之間的曼哈頓距離是| a-c | + | b-d |。
python中的示例
讓我們看看如何使用層次凝聚聚類來標記機器學習資料的具體示例。
import pandas as pd import numpy as np from matplotlib import pyplot as plt from sklearn.cluster import AgglomerativeClustering import scipy.cluster.hierarchy as sch
在本教程中,我們使用包含客戶列表的csv檔案及其gender, age, annual income 和 spending score。機器學習資料庫的下載地址:http://www.kankanyun.com/data/Mall_Customers.csv
為了在以後的圖表上顯示我們的資料,我們只能採用兩個變數(annual income 和spending score)。
dataset = pd.read_csv('./data.csv') X = dataset.iloc[:, [3, 4]].values
觀察樹狀圖,與任何聚類不相交的最高垂直距離是中間的綠色。假設5條垂直線超過閾值,則最佳聚類數為5。
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
我們利用歐幾里得距離來建立AgglomerativeClustering的例項,其中該歐幾里得距離是指點之間的距離和用於計算聚類的接近度的距離。
model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward') model.fit(X) labels = model.labels_
該labels_屬性返回一個整數陣列,其中值對應於不同的類。
我們可以使用簡寫表示法將屬於某個類的所有樣本顯示為特定顏色。
plt.scatter(X[labels==0, 0], X[labels==0, 1], s=50, marker='o', color='red') plt.scatter(X[labels==1, 0], X[labels==1, 1], s=50, marker='o', color='blue') plt.scatter(X[labels==2, 0], X[labels==2, 1], s=50, marker='o', color='green') plt.scatter(X[labels==3, 0], X[labels==3, 1], s=50, marker='o', color='purple') plt.scatter(X[labels==4, 0], X[labels==4, 1], s=50, marker='o', color='orange') plt.show()