KMeans聚类分析与轮廓系数评估

机器学习领域,聚类是一种无监督学习技术,用于将数据集中的样本划分为若干个组,使得同一组内的样本相似度高,而不同组之间的样本相似度低。KMeans算法是聚类分析中最为常见的一种算法,它通过迭代优化的方式将数据点分配到最近的聚类中心,从而实现数据的聚类。然而,KMeans算法的一个主要问题是,需要预先指定聚类的数量,即K值。轮廓系数(Silhouette Coefficient)是一种评估聚类效果的指标,它通过计算每个样本与其最近邻聚类的相似度,来评估聚类的效果。轮廓系数的值范围在-1到1之间,值越接近1,表示聚类效果越好;值接近0,表示聚类效果一般;值小于0,表示聚类效果较差。

在实际应用中,可以通过轮廓系数来评估不同K值下的聚类效果,从而选择一个最优的K值。例如,可以通过生成一组样本数据,然后使用KMeans算法进行聚类,并计算不同K值下的轮廓系数,来评估聚类的效果。以下是一个使用Python语言和Scikit-learn库实现的示例代码,该代码生成了一组样本数据,并使用KMeans算法进行了聚类,然后计算了不同K值下的轮廓系数,并使用Matplotlib库绘制了轮廓系数图和聚类结果图。

import matplotlib.cm as cm import matplotlib.pyplot as plt import numpy as np from sklearn.cluster import KMeans from sklearn.datasets import make_blobs from sklearn.metrics import silhouette_samples, silhouette_score # 生成样本数据 X, y = make_blobs(n_samples=500, n_features=2, centers=4, cluster_std=1, center_box=(-10.0, 10.0), shuffle=True, random_state=1) # 指定K值的范围 range_n_clusters = [2, 3, 4, 5, 6] for n_clusters in range_n_clusters: # 创建子图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 7)) # 计算轮廓系数 clusterer = KMeans(n_clusters=n_clusters, random_state=10) cluster_labels = clusterer.fit_predict(X) silhouette_avg = silhouette_score(X, cluster_labels) print("For n_clusters =", n_clusters, "The average silhouette_score is :", silhouette_avg) # 计算每个样本的轮廓系数 sample_silhouette_values = silhouette_samples(X, cluster_labels) y_lower = 10 for i in range(n_clusters): ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i] ith_cluster_silhouette_values.sort() size_cluster_i = ith_cluster_silhouette_values.shape[0] y_upper = y_lower + size_cluster_i color = cm.nipy_spectral(float(i) / n_clusters) ax1.fill_betweenx(np.arange(y_lower, y_upper), 0, ith_cluster_silhouette_values, facecolor=color, edgecolor=color, alpha=0.7) ax1.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i)) y_lower = y_upper + 10 # 绘制轮廓系数图 ax1.set_title("The silhouette plot for the various clusters.") ax1.set_xlabel("The silhouette coefficient values") ax1.set_ylabel("Cluster label") ax1.axvline(x=silhouette_avg, color="red", linestyle="--") ax1.set_yticks([]) ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1]) # 绘制聚类结果图 colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters) ax2.scatter(X[:, 0], X[:, 1], marker=".", s=30, lw=0, alpha=0.7, c=colors, edgecolor="k") centers = clusterer.cluster_centers_ ax2.scatter(centers[:, 0], centers[:, 1], marker="o", c="white", alpha=1, s=200, edgecolor="k") for i, c in enumerate(centers): ax2.scatter(c[0], c[1], marker="$%d$" % i, alpha=1, s=50, edgecolor="k") ax2.set_title("The visualization of the clustered data.") ax2.set_xlabel("Feature space for the 1st feature") ax2.set_ylabel("Feature space for the 2nd feature") plt.suptitle("Silhouette analysis for KMeans clustering on sample data with n_clusters = %d" % n_clusters, fontsize=14, fontweight="bold") plt.show()

通过上述代码,可以生成不同K值下的轮廓系数图和聚类结果图。从图中可以看出,当K值较小时,轮廓系数较高,表示聚类效果较好;当K值较大时,轮廓系数较低,表示聚类效果较差。因此,可以根据轮廓系数来选择一个最优的K值,以获得最佳的聚类效果。

需要注意的是,轮廓系数只是评估聚类效果的一个指标,它并不能保证找到全局最优的聚类解。在实际应用中,还需要结合其他指标和领域知识,来综合评估聚类的效果。此外,KMeans算法对初始聚类中心的选择比较敏感,因此可能需要多次运行算法,以获得稳定的聚类结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485