
如何高效爬取全球新聞網站 – 整合Scrapy、Selenium與Mediastack API實現自動化新聞采集
其中, 是數據的維度。
簇之間的距離:常用的簇間距離度量方法有單鏈法、全鏈法、平均鏈法和中心點法等。
全鏈法(最大距離):
平均鏈法(平均距離):
中心點法(簇中心距離):
其中, 和 分別是簇 和 的中心點。
層次聚類的過程可以分為自底向上(凝聚層次聚類)和自頂向下(分裂層次聚類)兩種。
下面,咱們主要介紹凝聚層次聚類的算法流程。
數學推理
為了保證層次聚類算法能夠有效地進行,需要證明以下幾點:
因此,新簇的距離不會比原來的最小距離更小。
通過以上數學推理和算法流程,層次聚類算法能夠有效地將數據點分成層次結構的簇,可以幫助大家理解數據的內在結構和分布。
下面的案例,咱們使用一個真實的數據集,大家可以直接使用api獲取。
使用來自 UCI 機器學習庫的“葡萄酒數據集”(Wine Dataset),該數據集包含了 178 種葡萄酒的 13 個化學特征,目標是通過層次聚類來分析這些葡萄酒的分組情況。
我們將包括以下步驟:
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()
通過比較不同的合并策略的樹狀圖,我們可以選擇最適合當前數據集的策略。
總結如下:
整個的這些步驟展示了如何使用層次聚類進行數據分析,大家可以通過可視化和算法優化提升結果的理解和效果。
層次聚類模型的優缺點
優點
缺點
K均值聚類(K-means Clustering)
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
層次聚類的優選場景
層次聚類在處理中小規模且具有層次結構的數據集時非常有效,特別是當不確定簇的數量時。然而,在大規模數據集或具有復雜形狀簇的情況下,其他算法如K均值聚類或DBSCAN可能更為適用。通過根據數據集的特性和具體需求選擇合適的聚類算法,可以更好地實現數據聚類和分析目標。
本文章轉載微信公眾號@深夜努力寫Python