在数据挖掘和机器学习领域,K-means聚类算法是一种非常流行的无监督学习技术。它通过将数据点划分成K个簇,帮助我们发现数据中的隐藏模式。然而,如何确定最佳的K值,以及如何评估聚类效果,一直是困扰许多数据分析师的问题。轮廓系数图是一种有效的评估工具,它可以帮助我们直观地了解K-means聚类效果。
轮廓系数简介
轮廓系数(Silhouette Coefficient)是衡量聚类效果的一个指标,它通过以下公式计算:
[ S(i) = \frac{b(i) - a(i)}{2 \cdot max(b(i), a(i))} ]
其中:
- ( a(i) ) 是点i与其同簇内其他点的平均距离(紧密度)。
- ( b(i) ) 是点i与不同簇内其他点的最小平均距离(分离度)。
轮廓系数的取值范围在-1到1之间,其中:
- ( S(i) = 1 ) 表示点i很好地被分配到了正确的簇中。
- ( S(i) = 0 ) 表示点i在两个簇之间处于边缘状态。
- ( S(i) = -1 ) 表示点i被错误地分配到了簇中。
使用轮廓系数图评估K-means聚类效果
要使用轮廓系数图评估K-means聚类效果,我们需要进行以下步骤:
数据预处理:对原始数据进行标准化或归一化处理,确保所有特征具有相同的量纲。
运行K-means算法:对于不同的K值,分别运行K-means算法,得到每个K值对应的聚类结果。
计算轮廓系数:对于每个K值,计算所有点的轮廓系数。
绘制轮廓系数图:以K值为横坐标,以平均轮廓系数为纵坐标,绘制轮廓系数图。
下面,我们将通过一个简单的例子来说明如何使用轮廓系数图来评估K-means聚类效果。
例子:鸢尾花数据集
鸢尾花数据集(Iris dataset)是机器学习领域常用的经典数据集,它包含150个样本,每个样本有4个特征。我们将使用鸢尾花数据集来演示如何使用轮廓系数图评估K-means聚类效果。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 加载数据
iris = datasets.load_iris()
X = iris.data
# 轮廓系数图
def plot_silhouette(X, max_k):
silhouette_avg_scores = []
for k in range(2, max_k+1):
kmeans = KMeans(n_clusters=k, random_state=42).fit(X)
labels = kmeans.labels_
silhouette_avg = silhouette_score(X, labels)
silhouette_avg_scores.append(silhouette_avg)
plt.plot(range(2, max_k+1), silhouette_avg_scores, marker='o')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Average silhouette score')
plt.title('Silhouette plot for K-means clustering')
plt.show()
# 绘制轮廓系数图
plot_silhouette(X, max_k=10)
在上述代码中,我们首先加载数据,然后定义了一个plot_silhouette函数,该函数遍历不同的K值,计算每个K值对应的平均轮廓系数,并绘制轮廓系数图。
从轮廓系数图中,我们可以观察到,当K=3时,平均轮廓系数达到最大值,这意味着K=3可能是最佳的聚类数目。
总结
通过使用轮廓系数图,我们可以直观地评估K-means聚类效果,并确定最佳的聚类数目。在实际应用中,我们可以根据数据特点和业务需求,调整参数,以达到更好的聚类效果。
