Python中的k-means聚類模型詳解
聚類分析是一種用於發現資料中相似物件的方法。在資料探勘、機器學習等領域,聚類分析被廣泛應用。 k-means聚類是其中一種較常見的聚類方法。它能夠將資料集中的樣本劃分成k個簇,且每個簇的內部差異最小,而簇間差異最大。本文將詳細介紹Python中的k-means聚類模型。
k-means聚類演算法是一種迭代的聚類方法。其核心步驟包括:初始化質心、計算距離、更新質心、判定停止條件等。
首先,需要指定聚類數k。然後隨機選擇k個資料樣本作為初始質心,對於剩下的每個樣本,將其分配到與其距離最近的質心所在簇中。接下來,計算每個簇中所有資料點與該簇的質心的距離平方和,作為該簇的誤差。然後更新每個簇的質心,將其移到該簇所有樣本的中心。重複上述步驟直到誤差小於某一閾值或達到迭代次數上限。
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」符號表示每個簇的質心。
如何決定最優的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()
k-means聚類有以下注意事項:
初值對結果產生影響較大,如果初始值不佳,可能會得到較差的結果。
聚類結果依賴選擇的距離測量,如歐幾里德距離、曼哈頓距離等。應根據實際情況進行選擇。
資料集中異常值容易被錯誤的簇吸引,應考慮移除異常值。
樣本類別分佈不平衡時,常見問題是得到具有極度偏態屬性的簇。
k-means聚類是廣泛應用的聚類演算法。 Python中,使用sklearn函式庫提供的KMeans函數可以快速實現,同時,也可以使用手肘法或輪廓係數法來確定最優的聚類數。同時,在應用中需注意k值的選擇、初始質心的設定等問題。
以上是Python中的k-means聚類模型詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!