请利用Python给出以下任务的完整代码:对鸢尾花数据集进行K-Means聚类:找到最佳类别数、绘制划分标识和原标识的交叉列表、计算兰德指数
时间: 2024-03-17 19:41:06 浏览: 61
好的,我来给您提供一个利用 Python 对鸢尾花数据集进行 K-Means 聚类的完整代码,主要分为三个部分,分别是数据集读取、K-Means 聚类以及评估聚类效果。
```python
# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import confusion_matrix
from sklearn.metrics.cluster import adjusted_rand_score
# 读取鸢尾花数据集
iris = load_iris()
X = iris.data
y_true = iris.target
# K-Means 聚类
inertias = []
ars = []
for n_clusters in range(2, 6):
kmeans = KMeans(n_clusters=n_clusters, random_state=0)
y_pred = kmeans.fit_predict(X)
inertias.append(kmeans.inertia_)
ars.append(adjusted_rand_score(y_true, y_pred))
# 找到最佳类别数
best_n_clusters = np.argmin(np.diff(inertias)) + 2
# 绘制划分标识和原标识的交叉列表
kmeans = KMeans(n_clusters=best_n_clusters, random_state=0)
y_pred = kmeans.fit_predict(X)
cm = confusion_matrix(y_true, y_pred)
df_cm = pd.DataFrame(cm, columns=iris.target_names, index=iris.target_names)
plt.figure(figsize=(5,4))
plt.title("Confusion Matrix")
sns.heatmap(df_cm, annot=True, cmap='Blues')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()
# 计算兰德指数
ari = adjusted_rand_score(y_true, y_pred)
print(f"Best number of clusters: {best_n_clusters}")
print(f"Adjusted Rand Index: {ari:.2f}")
```
代码的具体解释如下:
1. 首先,我们导入所需的库,这些库包括 numpy、pandas、matplotlib、sklearn 中的 load_iris、KMeans、confusion_matrix 和 adjusted_rand_score 等。其中,load_iris 是用于读取鸢尾花数据集的函数,KMeans 是用于实现 K-Means 聚类的类,confusion_matrix 是用于计算混淆矩阵的函数,adjusted_rand_score 是用于计算兰德指数的函数。
2. 接着,我们使用 load_iris 函数读取鸢尾花数据集,并将数据集中的样本特征保存在 X 中,将样本标签保存在 y_true 中。
3. 然后,我们通过循环遍历不同的聚类数,使用 KMeans 类实现 K-Means 聚类,并计算每种聚类数下的 SSE(簇内平方和)和兰德指数。其中,SSE 用于找到最佳聚类数,兰德指数用于评估聚类效果。
4. 在找到最佳聚类数后,我们再次使用 KMeans 类实现 K-Means 聚类,并计算混淆矩阵,最后绘制出划分标识和原标识的交叉列表。
5. 最后,我们计算兰德指数并输出结果,其中,兰德指数越接近 1,表示聚类效果越好。
希望这份代码能够帮到您!
阅读全文