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