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
数据的加载与处理
- 把已经下载好的数据进行导入(能够前往Iris - UCI Machine Learning Repository官网进行下载)
- 包含四个特征:萼片长度(Sepal Length)、萼片宽度(Sepal Width)、花瓣长度(Petal Length)和花瓣宽度(Petal Width),还有一个目标变量“Species”(种类)
- 由于K-means聚类属于无监督学习算法,不需要目标变量,所以从数据集中把最后一列删除,此时
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的下降速度会显著变缓,这个点通常被视作最佳聚类数。 - 通过观察肘部图,选取合适的聚类数。一般来说,在肘部位置(SSE下降速度明显变缓的位置)对应的聚类数比较合理。对于鸢尾花数据集,通常选取3个聚类数。
# 使用肘部法则来确定最佳聚类数
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为例)
-
为了直观地展示聚类结果,可以通过二维散点图来进行可视化。由于鸢尾花数据集有四个特征,能够选取其中两个特征(以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 Coefficient)和戴维斯-邦丁指数(Davies-Bouldin Index)。还有每个类别的中心点
# 计算轮廓系数
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)
-
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12739.html