首頁  >  文章  >  後端開發  >  Python中的k-means聚類模型詳解

Python中的k-means聚類模型詳解

王林
王林原創
2023-06-10 09:15:191924瀏覽

Python中的k-means聚類模型詳解

聚類分析是一種用於發現資料中相似物件的方法。在資料探勘、機器學習等領域,聚類分析被廣泛應用。 k-means聚類是其中一種較常見的聚類方法。它能夠將資料集中的樣本劃分成k個簇,且每個簇的內部差異最小,而簇間差異最大。本文將詳細介紹Python中的k-means聚類模型。

  1. k-means聚類的原理

k-means聚類演算法是一種迭代的聚類方法。其核心步驟包括:初始化質心、計算距離、更新質心、判定停止條件等。

首先,需要指定聚類數k。然後隨機選擇k個資料樣本作為初始質心,對於剩下的每個樣本,將其分配到與其距離最近的質心所在簇中。接下來,計算每個簇中所有資料點與該簇的質心的距離平方和,作為該簇的誤差。然後更新每個簇的質心,將其移到該簇所有樣本的中心。重複上述步驟直到誤差小於某一閾值或達到迭代次數上限。

  1. Python實作k-means聚類

Python中,sklearn函式庫提供了k-means聚類函數,是使用k-means聚類演算法的最簡單方法。以下以iris資料集為例,展示如何使用Python實作k-means聚類

from sklearn.cluster import KMeans
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data[:, :2]  # 为了便于可视化,只取前两个特征
y = iris.target

kmeans = KMeans(n_clusters=3)  # 聚成3类
kmeans.fit(X)

centroids = kmeans.cluster_centers_  # 质心
labels = kmeans.labels_  # 样本分类

# 绘制图形
import matplotlib.pyplot as plt

colors = ['red', 'green', 'blue']
for i in range(len(X)):
    plt.scatter(X[i][0], X[i][1], c=colors[labels[i]])
    
for c in centroids:
    plt.scatter(c[0], c[1], marker='x', s=300, linewidths=3, color='black')
    
plt.show()

執行以上程式碼,即可產生類似以下影像:

影像中,紅色、綠色和藍色點分別代表不同的簇,黑色「x」符號表示每個簇的質心。

  1. 如何選擇最優的k值

如何決定最優的k值,是k-means聚類演算法中比較困難的問題之一。以下介紹兩個常見的方法:手肘法和輪廓係數法。

手肘法:首先,將k值設定為較小的整數,計算每個簇的誤差平方和(SSE)。隨著k值的增加,誤差平方和會減少。當k值增加到一定程度後,SSE不再大幅下降。此時,將k值與SSE之間的關係繪製成曲線圖,必定呈現出肘部線段,該線段在此處的「肘」的位置,對應的k值即為最優的聚類數。

程式碼範例:

sse = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i).fit(X)
    sse.append(kmeans.inertia_)  # ineria_属性表示模型的误差平方和
 
plt.plot(range(1, 11), sse)
plt.xlabel('K')
plt.ylabel('SSE')
plt.show()

輪廓係數法:輪廓係數綜合了簇內不相關性和簇間相似度兩個因素。輪廓係數值越大,代表聚類效果越好。輪廓係數法的計算過程如下:

對每個樣本,計算其與同簇所有樣本的平均距離(稱為a),併計算其與最近其他簇的所有樣本的平均距離(稱為b)。

計算每個樣本的輪廓係數s,$s = rac {b-a} {max(a, b)}$。整個模型的輪廓係數為所有樣本輪廓係數的平均值。

程式碼範例:

from sklearn.metrics import silhouette_score

sil_scores = []
for k in range(2, 11):
    kmeans = KMeans(n_clusters=k).fit(X)
    sil_score = silhouette_score(X, kmeans.labels_)  # 计算轮廓系数
    sil_scores.append(sil_score)
    
plt.plot(range(2, 11), sil_scores)
plt.xlabel('K')
plt.ylabel('Silhouette Coefficient')
plt.show()
  1. k-means聚類注意事項

k-means聚類有以下注意事項:

初值對結果產生影響較大,如果初始值不佳,可能會得到較差的結果。

聚類結果依賴選擇的距離測量,如歐幾里德距離、曼哈頓距離等。應根據實際情況進行選擇。

資料集中異常值容易被錯誤的簇吸引,應考慮移除異常值。

樣本類別分佈不平衡時,常見問題是得到具有極度偏態屬性的簇。

  1. 總結

k-means聚類是廣泛應用的聚類演算法。 Python中,使用sklearn函式庫提供的KMeans函數可以快速實現,同時,也可以使用手肘法或輪廓係數法來確定最優的聚類數。同時,在應用中需注意k值的選擇、初始質心的設定等問題。

以上是Python中的k-means聚類模型詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn