其中,  是數據的維度。

簇之間的距離:常用的簇間距離度量方法有單鏈法、全鏈法、平均鏈法和中心點法等。

全鏈法(最大距離)

平均鏈法(平均距離)

中心點法(簇中心距離)

其中,  和  分別是簇  和  的中心點。

算法流程

層次聚類的過程可以分為自底向上(凝聚層次聚類)和自頂向下(分裂層次聚類)兩種。

下面,咱們主要介紹凝聚層次聚類的算法流程。

  1. 初始化
  1. 計算距離矩陣
  1. 合并最近的簇
  1. 更新距離矩陣
  1. 重復步驟3和4

數學推理

為了保證層次聚類算法能夠有效地進行,需要證明以下幾點:

  1. 距離矩陣的對稱性:距離矩陣  是對稱的,即 。這是因為距離度量滿足對稱性。
  2. 距離的非負性:距離矩陣  中的所有值都是非負的,即 。這是因為距離度量滿足非負性。
  3. 合并操作的單調性:每次合并操作后,新簇的距離不會小于之前的最小距離。以單鏈法為例,合并操作后的新簇與其他簇之間的距離為:

因此,新簇的距離不會比原來的最小距離更小。

通過以上數學推理和算法流程,層次聚類算法能夠有效地將數據點分成層次結構的簇,可以幫助大家理解數據的內在結構和分布。

Python案例

下面的案例,咱們使用一個真實的數據集,大家可以直接使用api獲取。

使用來自 UCI 機器學習庫的“葡萄酒數據集”(Wine Dataset),該數據集包含了 178 種葡萄酒的 13 個化學特征,目標是通過層次聚類來分析這些葡萄酒的分組情況。

我們將包括以下步驟:

  1. 數據集導入和預處理
  2. 使用層次聚類進行聚類分析
  3. 聚類結果的可視化
  4. 算法優化

1. 數據集導入和預處理

首先,我們需要導入數據集并做一定的預處理。

import pandas as pd
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns

# 加載數據集
data = load_wine()
df = pd.DataFrame(data.data, columns=data.feature_names)

# 數據標準化
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

2. 使用層次聚類進行聚類分析

我們使用?scipy?庫中的?linkage?和?dendrogram?函數進行層次聚類分析,并繪制樹狀圖。

from scipy.cluster.hierarchy import linkage, dendrogram

# 使用歐幾里得距離和沃德方法進行層次聚類
Z = linkage(df_scaled, method='ward')

# 繪制樹狀圖
plt.figure(figsize=(12, 8))
dendrogram(Z, labels=data.target, leaf_rotation=90, leaf_font_size=10)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()

3. 聚類結果的可視化

為了更好地理解聚類結果,我們可以將數據降維至二維,并用不同的顏色表示不同的簇。

from sklearn.decomposition import PCA
from scipy.cluster.hierarchy import fcluster

# 使用PCA將數據降維到二維
pca = PCA(n_components=2)
df_pca = pca.fit_transform(df_scaled)

# 從樹狀圖中選擇一個合適的閾值,劃分簇
max_d = 7.0 # 這個閾值需要根據樹狀圖手動調整
clusters = fcluster(Z, max_d, criterion='distance')

# 繪制二維降維后的聚類結果
plt.figure(figsize=(10, 8))
plt.scatter(df_pca[:, 0], df_pca[:, 1], c=clusters, cmap='rainbow', alpha=0.7)
plt.title('Hierarchical Clustering of Wine Dataset (2D PCA)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()

4. 算法優化

我們可以通過調整距離度量方法、合并策略等來優化算法。這里我們展示如何使用不同的合并策略進行層次聚類。

# 使用不同的合并策略進行層次聚類
methods = ['single', 'complete', 'average', 'ward']
plt.figure(figsize=(20, 15))

for i, method in enumerate(methods, 1):
Z = linkage(df_scaled, method=method)
plt.subplot(2, 2, i)
dendrogram(Z, labels=data.target, leaf_rotation=90, leaf_font_size=10)
plt.title(f'Linkage Method: {method.capitalize()}')
plt.xlabel('Sample index')
plt.ylabel('Distance')

plt.tight_layout()
plt.show()

通過比較不同的合并策略的樹狀圖,我們可以選擇最適合當前數據集的策略。

總結如下:

  1. 數據標準化:在聚類前標準化數據有助于消除不同特征量綱之間的影響。
  2. 降維:使用PCA將數據降維至二維,有助于可視化和理解高維數據的聚類結果。
  3. 樹狀圖(Dendrogram):通過觀察樹狀圖,可以確定合適的閾值來劃分簇。
  4. 合并策略比較:通過比較不同的合并策略,可以選擇最適合的數據集的策略,提高聚類效果。

整個的這些步驟展示了如何使用層次聚類進行數據分析,大家可以通過可視化和算法優化提升結果的理解和效果。

模型分析

層次聚類模型的優缺點

優點

  1. 直觀易懂:層次聚類生成的樹狀圖(dendrogram)可以清晰地展示數據的層次結構,直觀且易于理解。
  2. 無需預先指定簇的數量:與K均值聚類不同,層次聚類不需要預先指定簇的數量,適合于不確定簇數的情況。
  3. 適用于任意形狀的簇:層次聚類可以處理形狀復雜的簇,而K均值聚類更適合球形簇。
  4. 數據處理能力:層次聚類能處理小到中等規模的數據集,適用于一些小樣本但高維的數據集。

缺點

  1. 計算復雜度高:層次聚類的計算復雜度較高,通常為?,對大規模數據集不太適用。
  2. 對噪聲和離群點敏感:噪聲和離群點可能會影響聚類結果,導致聚類質量下降。
  3. 一旦合并無法撤銷:層次聚類一旦合并兩個簇,無法進行拆分,容易在早期步驟中產生錯誤。

與相似算法的對比

K均值聚類(K-means Clustering)

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)

適用場景

層次聚類的優選場景

  1. 數據規模適中:適用于小到中等規模的數據集,數據點數量在幾百到幾千之間。
  2. 簇數不確定:適用于不確定簇的數量,需要通過觀察樹狀圖來確定聚類結構。
  3. 數據結構層次化:適用于數據具有明顯的層次結構的場景,如生物分類、社會網絡分析等。

其他算法的優選場景

  1. 大規模數據集:對于大規模數據集,K均值聚類和MiniBatch K均值聚類更為適用,因為它們計算速度快且效率高。
  2. 復雜形狀的簇:當數據集中的簇形狀復雜且包含噪聲點時,DBSCAN算法更為適用,因為它能夠識別任意形狀的簇并自動處理噪聲點。
  3. 高維數據集:對于高維數據集,譜聚類(Spectral Clustering)可能更為適用,因為它通過圖論方法處理數據,能更好地捕捉高維空間中的數據結構。

最后

層次聚類在處理中小規模且具有層次結構的數據集時非常有效,特別是當不確定簇的數量時。然而,在大規模數據集或具有復雜形狀簇的情況下,其他算法如K均值聚類或DBSCAN可能更為適用。通過根據數據集的特性和具體需求選擇合適的聚類算法,可以更好地實現數據聚類和分析目標。

本文章轉載微信公眾號@深夜努力寫Python

上一篇:

講透一個強大算法案例,LSTM !!

下一篇:

講透一個強大算法模型,K-means Clustering !!
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費