鍵.png)
使用這些基本 REST API 最佳實踐構(gòu)建出色的 API
實際項目中Kmeans聚類應該是最為常用的聚類模型,但其實聚類模型的種類還挺多的,每種聚類模型都有其獨特的特性和應用場景。在實際應用中,需要根據(jù)具體的數(shù)據(jù)情況、算力資源和業(yè)務需求來選擇合適的模型。
在工作或?qū)W習中,聚類算法是非常常見的算法之一。這里與大家剖析總結(jié)下常用的聚類算法:
親和力傳播是一種基于實例的學習算法,用于聚類。它通過發(fā)送消息在數(shù)據(jù)點之間建立關(guān)系,并選擇最佳的聚類結(jié)果。
訓練過程通過不斷迭代,為兩對數(shù)據(jù)點之間相似度的輸入度量。在數(shù)據(jù)點之間交換實值消息,直到一組高質(zhì)量的范例和相應的群集逐漸出現(xiàn),使數(shù)據(jù)點之間形成聚類。
優(yōu)點
缺點
適用于任何需要基于實例學習的聚類任務。
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))
模型原理
聚合聚類是一種自底向上的聚類方法。它從數(shù)據(jù)點(或稱為觀測值)的集合開始,然后將這些點視為初始的簇。接著,算法逐步合并這些簇,直到滿足某個停止條件,如達到預設的簇數(shù)量或達到某個特定的簇大小。在這個過程中,算法通過計算簇之間的距離來確定哪些簇應該被合并。
模型訓練
優(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(Balanced Iterative Reducing and Clustering using Hierarchies)是一種基于層次的聚類方法。它通過構(gòu)建一個聚類特征樹(Clustering Feature Tree,CF Tree)來組織和存儲數(shù)據(jù)點,并利用該樹進行聚類。BIRCH的核心思想是利用聚類特征(Clustering Feature,CF)來描述數(shù)據(jù)點的聚類信息,并通過逐步合并最相似的聚類對來形成層次聚類。
模型訓練
優(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(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類方法。它的主要思想是:一個簇是由一個密度足夠大的區(qū)域所組成的,并且這個區(qū)域是核心對象所連接的稠密區(qū)域。DBSCAN將簇定義為具有足夠高密度的區(qū)域,并且通過噪聲點將簇與相鄰的密度區(qū)域分開。
模型訓練
優(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聚類是一種基于距離的聚類方法,通過最小化每個數(shù)據(jù)點到其所屬簇中心點的距離之和,將數(shù)據(jù)點劃分為K個簇。算法的主要思想是:每個簇有一個中心點,數(shù)據(jù)點被分配到最近的中心點所在的簇中。通過迭代更新每個簇的中心點,使得所有數(shù)據(jù)點到其所屬簇的中心點的距離之和最小。
模型訓練
優(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)分布)。
高斯混合模型的原理基于以下幾個假設:
模型訓練
優(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人工智能前沿