二、聚類方法匯總及對比

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

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

在工作或?qū)W習中,聚類算法是非常常見的算法之一。這里與大家剖析總結(jié)下常用的聚類算法:

親和力傳播 (Affinity Propagation)

模型原理

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

模型訓練

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

優(yōu)點

缺點

使用場景

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

Python示例代碼

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

# 生成樣本數(shù)據(jù)
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)

模型原理

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

模型訓練

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

優(yōu)點

缺點

使用場景

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

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

BIRCH 聚類模型

模型原理

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

模型訓練

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

優(yōu)點

缺點

使用場景

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

DBSCAN 聚類模型

模型原理

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

模型訓練

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

優(yōu)點

缺點

使用場景

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

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

K-Means 聚類模型

模型原理

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

模型訓練

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

優(yōu)點

缺點

使用場景

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

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

高斯混合模型 

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

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

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

模型訓練

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

優(yōu)點

缺點

使用場景

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

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

三、聚類評估指標

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

外部評價指標:

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

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

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

F1-score是查準率P、查全率R的調(diào)和平均:

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

內(nèi)部評價指標:

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

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

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

聚類評估指標對比:

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

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

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

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

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

本文章轉(zhuǎn)載微信公眾號@Python人工智能前沿

上一篇:

全面!圖神經(jīng)網(wǎng)絡(GNN)系統(tǒng)介紹及實踐(Pytorch)

下一篇:

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

我們有何不同?

API服務商零注冊

多API并行試用

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

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

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

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

#AI深度推理大模型API

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

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