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)
  • 作者:52flora

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python实现鸢尾花聚类分析详解:K-means聚类算法应用

    发表回复