K均值聚类算法是一种广泛应用于数据挖掘和机器学习领域的聚类算法。然而,K均值算法的性能在很大程度上依赖于初始聚类中心的选择。不合理的初始聚类中心可能导致算法陷入局部最优解,影响聚类效果。本文将详细介绍如何通过肘部法则和轮廓系数来优化K均值聚类算法中初始聚类中心的选择。
肘部法则是一种用于确定最佳聚类数K的方法。其基本思想是,随着聚类数K的增加,每个聚类的平均误差平方和(Sum of Squared Errors, SSE)会逐渐减小。当K值增加到某个点时,SSE的减小速度会明显放缓,这个点就是“肘部”,对应的K值即为最佳聚类数。
肘部法则的实现步骤如下:
示例代码(Python):
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
# 生成示例数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 计算不同K值下的SSE
sse = []
K = range(1, 11)
for k in K:
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(X)
sse.append(kmeans.inertia_) # inertia_属性即为SSE
# 绘制肘部法则图
plt.plot(K, sse, 'bx-')
plt.xlabel('K值')
plt.ylabel('SSE')
plt.title('肘部法则确定最佳K值')
plt.show()
轮廓系数(Silhouette Coefficient)是一种评估聚类效果好坏的指标。对于数据集中的每个样本点,轮廓系数定义为:
\[ s(i) = \frac{b(i) - a(i)}{\max\{a(i), b(i)\}} \]
其中,\(a(i)\) 是样本点i到其所属聚类中心的距离平均值,\(b(i)\) 是样本点i到其他聚类中心的最小距离平均值。轮廓系数的值域为[-1, 1],值越大表示聚类效果越好。
在使用轮廓系数选择初始聚类中心时,可以多次运行K均值算法,每次选择不同的初始聚类中心,然后计算每次聚类的轮廓系数。选择轮廓系数最大的那次聚类结果作为最终聚类结果。
示例代码(Python):
from sklearn.metrics import silhouette_score
# 假设已经确定了K值
K = 4
best_silhouette = -1
best_centers = None
best_labels = None
# 多次运行K均值算法,选择最佳初始聚类中心
for _ in range(10): # 尝试10次
kmeans = KMeans(n_clusters=K, random_state=_, n_init=1) # n_init=1表示只运行一次K均值
labels = kmeans.fit_predict(X)
centers = kmeans.cluster_centers_
silhouette_avg = silhouette_score(X, labels)
if silhouette_avg > best_silhouette:
best_silhouette = silhouette_avg
best_centers = centers
best_labels = labels
print("最佳轮廓系数:", best_silhouette)
通过结合肘部法则和轮廓系数,可以更有效地选择K均值聚类算法的初始聚类中心,从而提升聚类效果。肘部法则帮助确定最佳的聚类数K,而轮廓系数则帮助在多次运行中选出最佳的初始聚类中心。这两种方法共同作用于K均值聚类算法的优化过程,为聚类分析提供了有力的支持。