python 计算k-means轮廓系数并在聚类图表显示
时间: 2023-12-25 16:02:55 浏览: 22
在Python中,可以使用 `sklearn.metrics` 模块中的 `silhouette_samples` 函数来计算每个数据点的轮廓系数,并将其绘制在聚类图表上,示例如下:
```python
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据集
np.random.seed(0)
X = np.random.randn(100, 2)
# 计算聚类结果
kmeans = KMeans(n_clusters=3)
labels = kmeans.fit_predict(X)
# 计算每个数据点的轮廓系数
silhouette_vals = silhouette_samples(X, labels)
# 绘制聚类图表
fig, ax = plt.subplots(figsize=(8, 6))
y_ticks = []
y_lower, y_upper = 0, 0
for i, cluster in enumerate(np.unique(labels)):
cluster_silhouette_vals = silhouette_vals[labels == cluster]
cluster_silhouette_vals.sort()
y_upper += len(cluster_silhouette_vals)
color = plt.cm.Set2(i / 3)
ax.barh(range(y_lower, y_upper), cluster_silhouette_vals, height=1.0,
edgecolor='none', color=color)
y_ticks.append((y_lower + y_upper) / 2)
y_lower += len(cluster_silhouette_vals)
# 计算轮廓系数平均值
silhouette_avg = silhouette_score(X, labels)
# 绘制轮廓系数平均值虚线
ax.axvline(silhouette_avg, color='red', linestyle='--')
ax.set_yticks(y_ticks)
ax.set_yticklabels(np.unique(labels))
ax.set_xlabel('Silhouette Coefficient')
ax.set_ylabel('Cluster')
ax.set_title('Silhouette Analysis')
plt.show()
```
在上面这个示例中,我们首先使用KMeans算法对二维随机数据集X进行聚类,得到聚类标签 `labels`。然后,使用 `silhouette_samples` 函数计算每个数据点的轮廓系数,并将其绘制在聚类图表上。图表中每个条形图表示一个数据点,其高度表示该数据点的轮廓系数,颜色表示所属的聚类。每个聚类之间用空白间隔开来,Y轴表示聚类标签。横向的红色虚线表示轮廓系数平均值。可以通过观察图表来评估聚类效果,当条形图高度接近红色虚线时,表示聚类效果较好。