二、聚類方法匯總及對比

實際項目中Kmeans聚類應該是最為常用的聚類模型,但其實聚類模型的種類還挺多的,每種聚類模型都有其獨特的特性和應用場景。在實際應用中,需要根據具體的數據情況、算力資源和業務需求來選擇合適的模型。

  1. 親和力傳播:這是一種基于傳播算法的聚類技術,通過模擬信息傳播過程來實現聚類。它能夠快速有效地處理大規模數據集,特別適合用于社交網絡分析、推薦系統等領域。
  2. 聚合聚類:這是一種自下而上的聚類方法,通過逐步將相似的小規模對象合并為較大的簇,最終形成大規模的聚類。適合處理大規模數據集,并能夠發現任意形狀的簇。應用場景包括市場細分、客戶分群等。
  3. BIRCH(Balanced Iterative Reducing and Clustering Using Hierarchies):利用樹結構進行快速聚類和規約數據。通過構建聚類特征樹,能夠快速發現數據的聚類結構。適用于大規模數據集,尤其對于具有層次結構的數據有較好的效果。應用領域包括電子商務、市場分析等。
  4. DBSCAN(Density-Based Spatial Clustering of Applications with Noise):基于密度的聚類算法,能夠將密度相連的點劃分為簇,并在噪聲空間數據庫中發現任意形狀的聚類。適用于異常檢測、圖像分割等領域。
  5. 模糊C-means:一種基于模糊邏輯的聚類算法,與K-means相似,但允許一個數據點屬于多個簇,每個簇都有一定的隸屬度或概率。適合處理具有不確定性和模糊性的數據,在市場細分、文本挖掘等領域有廣泛應用。
  6. K-means:經典的基于距離的聚類算法,通過迭代計算將數據點劃分為K個簇,使得每個數據點到其所在簇中心的距離之和最小。應用場景包括市場細分、客戶分群等。
  7. K-medoids:改進的K-means算法,通過選取簇中位置最中心的樣本點作為參照點來進行聚類。對異常值不敏感,適合處理具有較大極端值的數據集。
  8. Mean Shift:基于密度的非參數聚類算法,通過計算每個點到其他點的距離評估密度,找到密度增大的方向以發現聚類。適合處理形狀不規則的簇,并能夠處理噪聲和異常值。應用場景包括圖像分割、異常檢測等。
  9. OPTICS (Ordering Points To Identify the Clustering Structure):基于密度的聚類算法,通過計算每個點到其他點的距離評估密度,并生成排序列表以識別聚類結構。能夠發現任意形狀和大小的簇,并處理噪聲和異常值。應用領域包括時間序列分析、圖像分割等。
  10. 主題模型:用于發現數據集中潛在的主題或模式的概率模型。通過對文檔集合進行建模,揭示其中的主題分布和詞語關系。適用于文本挖掘、信息檢索等領域。
  11. 高斯混合模型(GMM):一種概率模型,假設數據點是從多個高斯分布中生成的。能夠擬合復雜的數據分布,并給出每個數據點屬于各個簇的概率。適用于時間序列分析、語音識別等領域。
  12. 譜聚類:基于圖理論的聚類方法,通過構建數據的相似性矩陣并將其轉化為圖,然后對圖進行聚類以發現數據的內在結構。能夠發現任意形狀的簇,并處理噪聲和異常值。應用場景包括圖像分割、文本挖掘等。
  13. CLIQUE(Clustering In QUEst)是一種基于網格的聚類算法,它通過將數據空間劃分成多個網格單元,然后對每個網格單元進行聚類,從而發現數據的分布模式。CLIQUE算法的特點是簡單、高效,適用于大規模數據集的聚類分析。它能夠處理各種形狀和密度的簇,并且對噪聲和異常值具有較強的魯棒性。然而,CLIQUE算法對網格單元的劃分非常敏感,過細或過粗的劃分可能會影響聚類的結果。
  14. STING(Statistical Information Grid)是一種基于網格統計信息的聚類算法。與CLIQUE不同,STING在每個網格單元上計算統計信息,例如均值、方差、協方差等,然后基于這些統計信息進行聚類。STING算法的特點是能夠處理高維數據集,并且能夠發現數據中的非線性模式。它還具有較強的魯棒性,能夠處理異常值和噪聲。然而,STING算法的計算復雜度較高,需要較大的內存空間。
  15. SKWAVECLUSTER是一種基于聲波聚類的算法。它利用聲波傳播的特性進行聚類,將聲波的傳播路徑作為聚類的依據。SKWAVECLUSTER算法的特點是能夠發現數據中的任意形狀和大小的簇,并且具有較強的魯棒性。它適用于具有復雜分布模式的數據集,例如流數據、時間序列數據等。然而,SKWAVECLUSTER算法的計算復雜度較高,需要較長的運行時間。

在工作或學習中,聚類算法是非常常見的算法之一。這里與大家剖析總結下常用的聚類算法:

親和力傳播 (Affinity Propagation)

模型原理

親和力傳播是一種基于實例的學習算法,用于聚類。它通過發送消息在數據點之間建立關系,并選擇最佳的聚類結果。

模型訓練

訓練過程通過不斷迭代,為兩對數據點之間相似度的輸入度量。在數據點之間交換實值消息,直到一組高質量的范例和相應的群集逐漸出現,使數據點之間形成聚類。

優點

缺點

使用場景

適用于任何需要基于實例學習的聚類任務。

Python示例代碼

from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from sklearn.datasets import make_blobs

# 生成樣本數據
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.4, random_state=0)

# 訓練模型
af = AffinityPropagation(preference=-50).fit(X)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_

n_clusters_ = len(cluster_centers_indices)
print('Estimated number of clusters: %d' % n_clusters_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index (ARI): %0.3f"
% metrics.adjusted_rand_score(labels_true, labels))
print("Adjusted Mutual Information (AMI): %0.3f"
% metrics.adjusted_mutual_info_score(labels_true, labels))

聚合聚類 (Agglomerative Clustering)

模型原理

聚合聚類是一種自底向上的聚類方法。它從數據點(或稱為觀測值)的集合開始,然后將這些點視為初始的簇。接著,算法逐步合并這些簇,直到滿足某個停止條件,如達到預設的簇數量或達到某個特定的簇大小。在這個過程中,算法通過計算簇之間的距離來確定哪些簇應該被合并。

模型訓練

  1. 初始化:每個數據點被視為一個簇。
  2. 合并:根據某種距離度量(如歐氏距離、余弦相似度等),將最近的簇合并為一個新的簇。
  3. 重復:重復步驟2,直到滿足停止條件。
  4. 輸出:返回合并后的簇結果。

優點

缺點

使用場景

Python示例代碼(使用scikit-learn庫):

from sklearn.cluster import AgglomerativeClustering  # 導入AgglomerativeClustering類    
from sklearn import datasets # 導入datasets用于生成樣本數據
from sklearn.preprocessing import StandardScaler # 導入StandardScaler進行標準化處理
import matplotlib.pyplot as plt # 導入繪圖庫
# 生成樣本數據
iris = datasets.load_iris() # 使用Iris數據集作為示例
X = iris["data"] # 提取特征矩陣
# 數據標準化
scaler = StandardScaler()
X = scaler.fit_transform(X) # 對數據進行標準化處理
# 設置聚類數
n_clusters = 2 # 根據需求設置聚類數
# 創建AgglomerativeClustering對象并擬合數據
clustering = AgglomerativeClustering(n_clusters=n_clusters)
labels = clustering.fit_predict(X) # 獲取每個樣本點的聚類標簽
# 可視化結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射繪制結果圖
plt.show() # 顯示結果圖 ```

BIRCH 聚類模型

模型原理

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)是一種基于層次的聚類方法。它通過構建一個聚類特征樹(Clustering Feature Tree,CF Tree)來組織和存儲數據點,并利用該樹進行聚類。BIRCH的核心思想是利用聚類特征(Clustering Feature,CF)來描述數據點的聚類信息,并通過逐步合并最相似的聚類對來形成層次聚類。

模型訓練

  1. 初始化:為每個數據點創建一個聚類特征(CF)。
  2. 合并:根據相似度度量,合并最相似的CF對。
  3. 重復:重復步驟2,直到滿足停止條件(如達到預設的簇數量或達到某個特定的簇大小)。
  4. 輸出:返回合并后的簇結果。

優點

缺點

使用場景

Python示例代碼(使用pyclustering庫):

from pyclustering.cluster.birch import birch  # 導入BIRCH聚類算法    
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer # 導入中心初始化器
from pyclustering.samples.definitions import FCPS_SAMPLES # 導入樣本數據集
from pyclustering.utils import read_sample # 導入讀取樣本數據的工具
from pyclustering.view.gplot import gplot # 導入繪圖庫
from pyclustering.view.dendrogram import dendrogram # 導入層次聚類結果的顯示工具
from pyclustering.metrics.pairwise import euclidean_distance # 導入歐氏距離度量函數
import matplotlib.pyplot as plt # 導入繪圖庫
import numpy as np # 導入numpy庫進行數組操作
# 讀取樣本數據集[two_diamonds]
sample = read_sample(FCPS_SAMPLES.SAMPLE_TWO_DIAMONDS)
# 使用K-Means++初始化方法為BIRCH算法生成中心點(兩個中心點)
initial_centers = kmeans_plusplus_initializer(sample, 2).initialize()
# 創建BIRCH聚類對象并使用中心點初始化其內部結構
birch_instance = birch(sample, initial_centers, dist_metric=euclidean_distance)
# 執行聚類操作
birch_instance.process()
# 獲取聚類結果
clusters = birch_instance.get_clusters() # 獲取簇的索引列表
# 可視化結果
gplot(birch_instance.get_data(),BirchDataVisualizer(clusters),'birch') # BirchDataVisualizer是用于可視化BIRCH數據的自定義工具類 ```

DBSCAN 聚類模型

模型原理

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類方法。它的主要思想是:一個簇是由一個密度足夠大的區域所組成的,并且這個區域是核心對象所連接的稠密區域。DBSCAN將簇定義為具有足夠高密度的區域,并且通過噪聲點將簇與相鄰的密度區域分開。

模型訓練

  1. 初始化:選擇一個未被訪問過的點作為當前點。
  2. 密度估計:如果當前點的ε-鄰域內的點數量大于等于MinPts,則當前點為核心點。否則,當前點為噪聲點。
  3. 擴展簇:從核心點開始,將其標記為簇的一部分,并遞歸地訪問其ε-鄰域內的所有點。如果某個點的ε-鄰域內的點數量大于等于MinPts,則該點為核心點,并將其標記為已訪問。
  4. 重復:重復步驟2和3,直到所有點都被訪問。
  5. 輸出:返回所有簇的結果。

優點

缺點

使用場景

Python示例代碼(使用scikit-learn庫):

from sklearn.cluster import DBSCAN  # 導入DBSCAN聚類算法    
from sklearn import datasets # 導入datasets用于生成樣本數據
import matplotlib.pyplot as plt # 導入繪圖庫
# 生成樣本數據
iris = datasets.load_iris() # 使用Iris數據集作為示例
X = iris["data"] # 提取特征矩陣
# 創建DBSCAN對象并擬合數據
dbscan = DBSCAN(eps=0.3, min_samples=5) # eps是鄰域半徑,min_samples是形成核心對象的最小點數
labels = dbscan.fit_predict(X) # 獲取每個樣本點的聚類標簽
# 可視化結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射繪制結果圖
plt.show() # 顯示結果圖 ```

K-Means 聚類模型

模型原理

K-Means聚類是一種基于距離的聚類方法,通過最小化每個數據點到其所屬簇中心點的距離之和,將數據點劃分為K個簇。算法的主要思想是:每個簇有一個中心點,數據點被分配到最近的中心點所在的簇中。通過迭代更新每個簇的中心點,使得所有數據點到其所屬簇的中心點的距離之和最小。

模型訓練

  1. 初始化:隨機選擇K個中心點。
  2. 分配數據點:將每個數據點分配到最近的中心點所在的簇中。
  3. 更新中心點:重新計算每個簇的中心點,即簇中所有數據點的均值。
  4. 重復:重復步驟2和3,直到中心點不再發生顯著變化或達到預設的迭代次數。
  5. 輸出:返回K個簇的結果。

優點

缺點

使用場景

Python示例代碼(使用scikit-learn庫):

from sklearn.cluster import KMeans  # 導入K-Means聚類算法    
from sklearn import datasets # 導入datasets用于生成樣本數據
import matplotlib.pyplot as plt # 導入繪圖庫
# 生成樣本數據
iris = datasets.load_iris() # 使用Iris數據集作為示例
X = iris["data"] # 提取特征矩陣
# 創建K-Means對象并擬合數據
kmeans = KMeans(n_clusters=3) # 假設有3個簇
labels = kmeans.fit_predict(X) # 獲取每個樣本點的聚類標簽
# 可視化結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射繪制結果圖
plt.show() # 顯示結果圖 ```

高斯混合模型 

高斯混合模型是一種概率模型,用于表示數據點集合的混合高斯分布。在聚類任務中,高斯混合模型將數據點劃分為K個簇,每個簇的數據點都遵循一個高斯分布(正態分布)。

高斯混合模型的原理基于以下幾個假設:

  1. 每個簇的數據點都遵循一個高斯分布:每個簇的分布參數(均值和協方差)由該簇中的數據點估計得出。
  2. 簇之間相互獨立:每個簇的高斯分布是獨立的,不同簇之間沒有依賴關系。
  3. 數據點屬于各個簇的概率已知:通過概率模型計算每個數據點屬于各個簇的概率。

模型訓練

  1. 初始化:隨機選擇K個中心點,每個中心點初始化為數據集中的一個數據點。
  2. 分配數據點:計算每個數據點到每個中心點的距離,將數據點分配到最近的中心點所在的簇中。
  3. 更新中心點和協方差:重新計算每個簇的中心點和協方差(均值和方差)。
  4. 重新分配數據點:根據新的中心點和協方差,重新分配數據點到各個簇中。
  5. 重復:重復步驟3和4,直到中心點和協方差不再發生顯著變化或達到預設的迭代次數。
  6. 輸出:返回K個簇的結果,每個簇具有其高斯分布的參數(均值和協方差)。

優點

缺點

使用場景

Python示例代碼(使用scikit-learn庫):

from sklearn.mixture import GaussianMixture  # 導入高斯混合模型    
from sklearn import datasets # 導入datasets用于生成樣本數據
import matplotlib.pyplot as plt # 導入繪圖庫
# 生成樣本數據
iris = datasets.load_iris() # 使用Iris數據集作為示例
X = iris["data"] # 提取特征矩陣
# 創建高斯混合模型對象并擬合數據
gmm = GaussianMixture(n_components=3) # 假設有3個簇
labels = gmm.fit_predict(X) # 獲取每個樣本點的聚類標簽
# 可視化結果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') # 使用viridis色彩映射繪制結果圖
plt.show() # 顯示結果圖 ```

三、聚類評估指標

常用評估指標包括外部評價指標和內部評價指標。外部評價指標是在已知真實標簽的情況下評估聚類結果的準確性,而內部評價指標則是在不知道真實標簽的情況下評估聚類結果的質量。

外部評價指標:

準確率(accuracy)。即所有的預測正確(TP+TN)的占總數(TP+FP+TN+FN)的比例;

查準率P(precision):是指分類器預測為Positive的正確樣本(TP)的個數占所有預測為Positive樣本個數(TP+FP)的比例;

查全率R(recall):是指分類器預測為Positive的正確樣本(TP)的個數占所有的實際為Positive樣本個數(TP+FN)的比例。

F1-score是查準率P、查全率R的調和平均:

調整蘭德系數(Adjusted Rand Index, ARI):衡量聚類結果與真實標簽的匹配程度,取值范圍為[-1,1],值越大表示聚類效果越好。

內部評價指標:

輪廓系數(Silhouette Coefficient):通過計算同類樣本間的平均距離和不同類樣本間的平均距離來評估聚類效果,取值范圍為[-1,1],值越大表示聚類效果越好。

標準化互信息(Normalized Mutual Information, NMI):衡量聚類結果與真實標簽的相似性,取值范圍為[0,1],值越大表示聚類效果越好。

互信息(Mutual Information, MI):類似于NMI,但不需要對數據進行標準化處理。

聚類評估指標對比:

準確率、召回率和F值:簡單易用,但可能不適用于非平衡數據集。

ARI:對異常值不敏感,但計算復雜度較高,且對參數設置敏感。

輪廓系數:考慮了樣本間的相對距離,能夠更準確地反映聚類效果,但計算復雜度較高。

NMI和MI:能夠準確地評估聚類效果,尤其適用于樣本分布不均勻的情況,但計算復雜度較高。

在處理實際問題時,可以嘗試多種指標,以便更全面地評估聚類效果。同時,雖然存在多種量化聚類質量的指標,但對聚類群的實際評估往往是主觀的,并很經常需要結合領域的業務經驗

本文章轉載微信公眾號@Python人工智能前沿

上一篇:

全面!圖神經網絡(GNN)系統介紹及實踐(Pytorch)

下一篇:

自主AI Agent 的構建|Function Calling 技術實例探索
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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