Python中的層次聚類演算法詳解

WBOY
發布: 2023-06-10 09:28:37
原創
2287 人瀏覽過

層次聚類演算法是一種將資料點分組的無監督學習演算法,也被稱為層次聚合(hierarchical clustering)或分級聚合(hierarchical clustering)演算法。它根據點與點之間的相似性或距離,在不斷地合併最相似的點或群集,最後得到一棵樹形結構(也叫聚類樹或分類樹),將所有點分為若干個簇。

Python是廣泛使用的程式語言之一,擁有許多強大的資料處理和視覺化工具,層次聚類演算法也有很多實作。在本篇文章中,我們將討論Python中實作層次聚類演算法的方法和一些最佳實踐。

資料的準備

在開始層次聚類之前,需要先準備好用來聚類的資料集。一般而言,這些資料集應該滿足以下條件:

  • 資料集應該是數值型的,非數值型資料可能會導致演算法出現錯誤。
  • 資料集應該是預處理過的,即已經經過了標準化、特徵選擇或其他預處理操作,以消除資料偏差和雜訊。

在Python中,我們可以使用pandas庫來載入、準備和預處理資料。 pandas提供了DataFrame資料結構,可以方便地處理表格資料。以下是一個簡單的例子:

import pandas as pd

# 读取csv文件
data = pd.read_csv('data.csv')

# 对数据进行预处理(比如标准化)
data = (data - data.mean()) / data.std()
登入後複製

其中,我們首先呼叫pandas的read_csv函數讀取一個csv文件,然後將讀取的資料進行標準化處理,以便將資料放入演算法中。

聚類演算法的選擇

在Python中,有許多聚類演算法可供選擇,而層次聚類演算法是其中之一。但是,它需要根據資料的特徵和需求來選擇合適的演算法。

在經典層次聚類演算法中,有兩種​​主要的連結方法:最小距離和最大距離。最小距離(或稱為單聯通性)方法比較兩個群體中最相似的點,而最大距離(或稱為全聯通性)方法則比較兩個群體中最不相似的點。另外,還有一種平均連結方法(也叫UPGMA演算法),它使用兩個群體之間的平均距離來計算相似性。在Python中,我們可以使用scipy函式庫中的linkage函數來執行層次聚類。以下是一個簡單的範例:

from scipy.cluster.hierarchy import linkage

# 进行层次聚类
Z = linkage(data, method='single')
登入後複製

在這個範例中,我們使用linkage函數進行最小距離聚類。函數的第一個參數是數據,第二個參數是使用的連結方法。這裡我們使用了'single'方法,也就是最小距離連結方法。

樹狀結構的視覺化

樹狀結構是層次聚類演算法的核心部分,可以使用樹狀圖對其進行視覺化。 Python提供了許多用於視覺化的工具,其中最受歡迎的兩個是matplotlib和seaborn函式庫。

以下是使用matplotlib函式庫繪製樹狀圖的簡單範例:

import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram

fig, ax = plt.subplots(figsize=(15, 10))

# 绘制树状图
dendrogram(Z, ax=ax, leaf_font_size=8)
plt.show()
登入後複製

在這個範例中,我們先建立了一個有ax軸的畫布,然後呼叫dendrogram 函數繪製樹狀圖。此函數的第一個參數是Z矩陣,第二個參數是軸物件。 leaf_font_size參數用於調整葉子大小。

使用seaborn庫我們可以獲得更美觀和互動性更強的視覺化效果。以下是使用seaborn庫繪製樹狀圖的例子:

import seaborn as sns

sns.set(style='white')

# 将聚类结果转换为DataFrame
df = pd.DataFrame({'x': data.index, 'y': Z[:, 2]})

# 绘制树状图
sns.scatterplot(x='x', y='y', data=df, s=50, legend=False)
plt.show()
登入後複製

在這個例子中,我們首先將聚類結果轉換為一個資料幀,然後使用seaborn庫中的scatterplot函數繪製樹狀圖。 s參數用於調整點的大小。

簇的選擇

在層次聚類演算法中,有兩種​​選擇簇的方法:基於距離(即樹狀圖中的高度)和基於數量。基於距離是指將最大距離或最小距離設為閾值,並將樹狀圖割開,形成簇狀。基於數量是指選擇一定數量的簇,通常是從最大距離或最小距離開始。這兩種方法都有其優點和缺點,需要根據具體情況選擇。

以下是一個將層次聚類結果轉換為簇列表的簡單範例:

from scipy.cluster.hierarchy import fcluster

# 将层次聚类结果转换为簇列表
clusters = fcluster(Z, t=2.0, criterion='distance')
登入後複製

在這個範例中,我們使用fcluster函數將層次聚類結果轉換為簇列表。此函數的第一個參數是Z矩陣,第二個參數是閾值,第三個參數是決定閾值類型的標準。

總結

在本篇文章中,我們討論了Python中實作層次聚類演算法的方法和一些最佳實踐。我們首先了解了資料的準備工作,然後討論了演算法的選擇和樹形結構的可視化。最後,我們討論了簇的選擇方法。這些方法可以幫助我們更好地理解層次聚類演算法,使得我們可以將其應用到自己的資料中,從而得到有用的結論。

以上是Python中的層次聚類演算法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡[email protected]
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!