其中,  是數(shù)據(jù)的維度。

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

全鏈法(最大距離)

平均鏈法(平均距離)

中心點(diǎn)法(簇中心距離)

其中,  和  分別是簇  和  的中心點(diǎn)。

算法流程

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

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

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

數(shù)學(xué)推理

為了保證層次聚類算法能夠有效地進(jìn)行,需要證明以下幾點(diǎn):

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

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

通過以上數(shù)學(xué)推理和算法流程,層次聚類算法能夠有效地將數(shù)據(jù)點(diǎn)分成層次結(jié)構(gòu)的簇,可以幫助大家理解數(shù)據(jù)的內(nèi)在結(jié)構(gòu)和分布。

Python案例

下面的案例,咱們使用一個(gè)真實(shí)的數(shù)據(jù)集,大家可以直接使用api獲取。

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

我們將包括以下步驟:

  1. 數(shù)據(jù)集導(dǎo)入和預(yù)處理
  2. 使用層次聚類進(jìn)行聚類分析
  3. 聚類結(jié)果的可視化
  4. 算法優(yōu)化

1. 數(shù)據(jù)集導(dǎo)入和預(yù)處理

首先,我們需要導(dǎo)入數(shù)據(jù)集并做一定的預(yù)處理。

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

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

# 數(shù)據(jù)標(biāo)準(zhǔn)化
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

2. 使用層次聚類進(jìn)行聚類分析

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

from scipy.cluster.hierarchy import linkage, dendrogram

# 使用歐幾里得距離和沃德方法進(jìn)行層次聚類
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. 聚類結(jié)果的可視化

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

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

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

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

# 繪制二維降維后的聚類結(jié)果
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. 算法優(yōu)化

我們可以通過調(diào)整距離度量方法、合并策略等來優(yōu)化算法。這里我們展示如何使用不同的合并策略進(jìn)行層次聚類。

# 使用不同的合并策略進(jìn)行層次聚類
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()

通過比較不同的合并策略的樹狀圖,我們可以選擇最適合當(dāng)前數(shù)據(jù)集的策略。

總結(jié)如下:

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

整個(gè)的這些步驟展示了如何使用層次聚類進(jìn)行數(shù)據(jù)分析,大家可以通過可視化和算法優(yōu)化提升結(jié)果的理解和效果。

模型分析

層次聚類模型的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

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

缺點(diǎn)

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

與相似算法的對比

K均值聚類(K-means Clustering)

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

適用場景

層次聚類的優(yōu)選場景

  1. 數(shù)據(jù)規(guī)模適中:適用于小到中等規(guī)模的數(shù)據(jù)集,數(shù)據(jù)點(diǎn)數(shù)量在幾百到幾千之間。
  2. 簇?cái)?shù)不確定:適用于不確定簇的數(shù)量,需要通過觀察樹狀圖來確定聚類結(jié)構(gòu)。
  3. 數(shù)據(jù)結(jié)構(gòu)層次化:適用于數(shù)據(jù)具有明顯的層次結(jié)構(gòu)的場景,如生物分類、社會網(wǎng)絡(luò)分析等。

其他算法的優(yōu)選場景

  1. 大規(guī)模數(shù)據(jù)集:對于大規(guī)模數(shù)據(jù)集,K均值聚類和MiniBatch K均值聚類更為適用,因?yàn)樗鼈冇?jì)算速度快且效率高。
  2. 復(fù)雜形狀的簇:當(dāng)數(shù)據(jù)集中的簇形狀復(fù)雜且包含噪聲點(diǎn)時(shí),DBSCAN算法更為適用,因?yàn)樗軌蜃R別任意形狀的簇并自動處理噪聲點(diǎn)。
  3. 高維數(shù)據(jù)集:對于高維數(shù)據(jù)集,譜聚類(Spectral Clustering)可能更為適用,因?yàn)樗ㄟ^圖論方法處理數(shù)據(jù),能更好地捕捉高維空間中的數(shù)據(jù)結(jié)構(gòu)。

最后

層次聚類在處理中小規(guī)模且具有層次結(jié)構(gòu)的數(shù)據(jù)集時(shí)非常有效,特別是當(dāng)不確定簇的數(shù)量時(shí)。然而,在大規(guī)模數(shù)據(jù)集或具有復(fù)雜形狀簇的情況下,其他算法如K均值聚類或DBSCAN可能更為適用。通過根據(jù)數(shù)據(jù)集的特性和具體需求選擇合適的聚類算法,可以更好地實(shí)現(xiàn)數(shù)據(jù)聚類和分析目標(biāo)。

本文章轉(zhuǎn)載微信公眾號@深夜努力寫Python

上一篇:

講透一個(gè)強(qiáng)大算法案例,LSTM !!

下一篇:

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

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

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

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)