分别使用K-means和K-medoids算法对sklearn中的鸢尾花数据集进行聚类(聚类数目设置为3),并评估这两种聚类算法的准确率。并进行数据可视化
时间: 2024-12-28 15:39:35 浏览: 16
首先,让我们分别使用K-means和K-medoids算法对Python的scikit-learn库中的Iris数据集进行聚类,我们将聚类数设为3。
1. **K-means算法**:
- 导入必要的库:`from sklearn.cluster import KMeans`, `from sklearn.datasets import load_iris`, `import matplotlib.pyplot as plt`
- 加载鸢尾花数据集:`iris = load_iris()`
- 应用K-means:`kmeans = KMeans(n_clusters=3)`, `kmeans.fit(iris.data)`
- 预测类别:`labels = kmeans.labels_`
- 计算准确率:由于sklearn的KMeans并未直接提供准确率,我们可以手动计算,例如通过比较预测标签与实际标签,但这通常用于分类任务而非聚类评价,对于聚类我们通常使用轮廓系数(Silhouette Coefficient)等指标。
2. **K-medoids算法**:
- 使用`from sklearn.metrics import silhouette_score`导入轮廓系数
- `from sklearn.cluster import DBSCAN`,因为DBSCAN不是严格的K-medoids,但我们可以通过其找到潜在的聚类中心(medoids)
- 实现K-medoids的库可能需要单独安装,如`imblearn`中的`IterativeImputer`结合`MiniBatchKMedoids`,这里简化处理:
```python
from imblearn.pipeline import Pipeline
pipeline = Pipeline([
('imbalance', IterativeImputer()),
('k_medoids', MiniBatchKMedoids(n_clusters=3))
])
pipeline.fit(iris.data)
labels_kmedoids = pipeline['k_medoids'].labels_
```
- 计算K-medoids的轮廓系数:`silhouette_avg_kmedoids = silhouette_score(iris.data, labels_kmedoids)`
为了可视化结果,我们可以绘制每个类别的花萼长度和宽度:
```python
plt.scatter(iris.data[labels == 0, 0], iris.data[labels == 0, 2], label='Cluster 1')
plt.scatter(iris.data[labels == 1, 0], iris.data[labels == 1, 2], label='Cluster 2')
plt.scatter(iris.data[labels == 2, 0], iris.data[labels == 2, 2], label='Cluster 3')
# 对于K-medoids的可视化,可以使用类似的方式,只是用`labels_kmedoids`替换`labels`
plt.xlabel('Sepal length')
plt.ylabel('Petal width')
plt.legend()
plt.show()
```
阅读全文