1. 程式人生 > >Python中的凝聚層次聚類示例

Python中的凝聚層次聚類示例

https://www.toutiao.com/a6641489713536434695/

 

2019-01-01 19:32:04

層次聚類演算法將相似的物件分組到稱為聚類的組中。層次聚類演算法有兩種:

  • 凝聚(Agglomerative )-自下而上的方法。從許多小聚類開始,然後將它們合併到一起,建立更大的聚類。
  • 分裂 (Divisive )- 自上而下的方法。從單個聚類開始,而不是將其拆分為更小的聚類。

Python中的凝聚層次聚類示例

 

層次聚類的一些優缺點

優點

  • 不假設特定數量的聚類(即k均值)
  • 可能對應於有意義的層次關係

缺點

  • 一旦決定組合兩個聚類,它就無法撤消
  • 遇到大機器學習資料集時太慢,O(2log())

它時如何運作的

1.使每個資料點成為一個聚類

Python中的凝聚層次聚類示例

 

2.取兩個最接近的聚類並使它們成為一個聚類

Python中的凝聚層次聚類示例

 

3.重複步驟2,直到只有一個聚類

Python中的凝聚層次聚類示例

 

樹形圖

我們可以使用樹形圖來顯示分組的歷史,並找出最佳的聚類數。

  • 確定不與任何其他聚類相交的最大垂直距離
  • 在兩個末端畫一條水平線
  • 最佳聚類數等於通過水平線的垂直線數

例如,在下面的例子中,沒有的最佳選擇。叢集將是4。

Python中的凝聚層次聚類示例

 

連線標準(Linkage Criteria)

與梯度下降類似,您可以調整某些引數以獲得截然不同的結果。

Python中的凝聚層次聚類示例

 

連線標準指的是如何計算聚類之間的距離

Python中的凝聚層次聚類示例

 

Single Linkage

兩個聚類之間的距離是每個聚類中兩點之間的最短距離

Python中的凝聚層次聚類示例

 

Complete Linkage

兩個聚類之間的距離是每個聚類中兩點之間的最長距離

Python中的凝聚層次聚類示例

 

Average Linkage

簇之間的距離是一個聚類中每個點與另一個聚類中每個點之間的平均距離

Python中的凝聚層次聚類示例

 

Ward Linkage

聚類之間的距離是所有聚類內的平方差的總和

Python中的凝聚層次聚類示例

 

距離度量

用於計算資料點之間距離的方法將影響最終結果。

歐幾里德距離

兩點之間的最短距離。例如,如果x =(a,b)和y =(c,d),則x和y之間的歐幾里德距離為√((a-c)²+(b-d)²)

Python中的凝聚層次聚類示例

 

曼哈頓距離

想象一下,你在一個大城市的市中心,你想要從A點到達B點。你將無法跨越建築物,而是你必須沿著各條街道行走。例如,如果x =(a,b)和y =(c,d),則x和y之間的曼哈頓距離是| a-c | + | b-d |。

Python中的凝聚層次聚類示例

 

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

Python中的凝聚層次聚類示例

 

在本教程中,我們使用包含客戶列表的csv檔案及其gender, age, annual income 和 spending score。機器學習資料庫的下載地址:http://www.kankanyun.com/data/Mall_Customers.csv

Python中的凝聚層次聚類示例

 

為了在以後的圖表上顯示我們的資料,我們只能採用兩個變數(annual income 和spending score)。

dataset = pd.read_csv('./data.csv')
X = dataset.iloc[:, [3, 4]].values

Python中的凝聚層次聚類示例

 

觀察樹狀圖,與任何聚類不相交的最高垂直距離是中間的綠色。假設5條垂直線超過閾值,則最佳聚類數為5。

dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))

Python中的凝聚層次聚類示例

 

我們利用歐幾里得距離來建立AgglomerativeClustering的例項,其中該歐幾里得距離是指點之間的距離和用於計算聚類的接近度的距離。

model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
model.fit(X)
labels = model.labels_

Python中的凝聚層次聚類示例

 

該labels_屬性返回一個整數陣列,其中值對應於不同的類。

Python中的凝聚層次聚類示例

 

我們可以使用簡寫表示法將屬於某個類的所有樣本顯示為特定顏色。

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()

Python中的凝聚層次聚類示例