Python实现鸢尾花聚类分析详解:K-means聚类算法应用
使用vscode软件编写
涉及的包以及算法
pandas:用于数据处理和分析。鸢尾花聚类分析numpy:用于数值计算。matplotlib.pyplot:用于绘图。sklearn.cluster.KMeans:用于执行K-means聚类。sklearn.metrics:用于评估聚类性能。seaborn:用于更美观的绘图。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn import metrics
import seaborn as sns
数据加载与处理
X现在只包含四个特征列。data = pd.read_table("D:\AIExercise\iris.data")
# print(data)
# 将下载的data数据转换为csv数据
data.to_csv("D:\AIExercise\iris.csv",sep='|',index=False)
print(data)
# 直接读取csv文件
iris = pd.read_csv("D:\\AIExercise\\iris.csv", header=None)
# 为数据添加列名
iris.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
# 查看数据的前几行,确保数据加载正确
print(iris.head(15))
# 提取特征数据(不包括最后一列的物种名称)
X = iris.iloc[:, :-1].values
聚类结果并获取聚类中心
n_clusters 的值),可以使用肘部法则(Elbow Method)。肘部法则通过观察随着聚类数增加,聚类的总平方误差(Within-Cluster Sum of Squares, WCSS)的变化趋势来确定最佳聚类数。当增加聚类数时,WCSS 会逐渐减小,但当达到某个点后,WCSS 的下降速度会显著减缓,这个点通常被认为是最佳聚类数。# 使用肘部法则确定最佳聚类数
wcss = []
for i in range(1, 11): # 测试 1 到 10 个聚类
kmeans = KMeans(n_clusters=i, random_state=0)
kmeans.fit(X)
wcss.append(kmeans.inertia_) # inertia_ 是 WCSS 的值
# 绘制肘部图
plt.figure(figsize=(10, 6))
plt.plot(range(1, 11), wcss, marker='o')
plt.title('Elbow Method For Optimal Number of Clusters')
plt.xlabel('Number of Clusters')
plt.ylabel('WCSS')
plt.xticks(range(1, 11))
plt.show()
# 使用KMeans进行聚类分析
# 这里假设我们已经知道鸢尾花有3个类别,所以设置n_clusters=3
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
# 将聚类结果标签添加到原始数据中
iris['cluster'] = kmeans.labels_
# 查看聚类结果
print(iris.head(15))


可视化聚类结果(以sepal_length和sepal_width为例)
X 标记表示聚类中心。plt.figure(figsize=(10, 6))
sns.scatterplot(x='sepal_length', y='sepal_width', hue='cluster', data=iris, palette='viridis', s=100)
plt.title('KMeans Clustering of Iris Dataset')
plt.show()

存在中文字需要设置参数
# 设置绘图参数,确保中文和负号显示正常
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
评估聚效果
# 计算轮廓系数
silhouette_avg = metrics.silhouette_score(X, kmeans.labels_)
print(f'Silhouette Score: {silhouette_avg:.2f}')
# 计算戴维斯-邦丁指数
dbi = metrics.davies_bouldin_score(X, kmeans.labels_)
print(f"戴维斯-邦丁指数:{dbi:.2f}")
# 输出聚类中心
cluster_centers = kmeans.cluster_centers_
print("Cluster Centers:\n", cluster_centers)
# 计算每个类别的中心点
cluster_centers = kmeans.cluster_centers_
print("Cluster Centers:\n", cluster_centers)

作者:52flora
