python 计算k-means轮廓系数并在聚类图表下方显示
时间: 2023-12-25 08:02:55 浏览: 24
在Python中,可以使用 `sklearn.metrics` 模块中的 `silhouette_samples` 和 `silhouette_score` 函数来计算每个数据点的轮廓系数和轮廓系数的平均值,然后将其绘制在聚类图表下方,示例如下:
```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)
# 计算轮廓系数平均值
silhouette_avg = silhouette_score(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)
# 绘制轮廓系数平均值虚线
ax.axvline(silhouette_avg, color='red', linestyle='--')
# 设置图表属性
ax.set_xlabel('Silhouette Coefficient')
ax.set_ylabel('Cluster')
ax.set_title('Silhouette Analysis')
# 绘制轮廓系数平均值文本
ax.text(1.0, 0.5, f'Average Silhouette Score: {silhouette_avg:.2f}',
transform=ax.transAxes, bbox=dict(facecolor='white', edgecolor='black'))
plt.show()
```
在上面这个示例中,我们首先使用KMeans算法对二维随机数据集X进行聚类,得到聚类标签 `labels`。然后,使用 `silhouette_samples` 函数计算每个数据点的轮廓系数,并使用 `silhouette_score` 函数计算轮廓系数平均值。最后,将轮廓系数平均值作为文本绘制在聚类图表下方。可以通过观察图表来评估聚类效果,当轮廓系数平均值越接近1,表示聚类效果越好。