案例教学:K-means聚类算法案例(有源代码和数据集)

本案例将介绍算法的应用场景、案例价值、算法原理、代码讲解、算法实现、模型训练、模型保存、调用模型、模型预测,这几个方面进行讲解。本案例为机器学习算法,数据集较少,占用CPU资源较小,无需独立显卡即可训练模型。

1.案例介绍

K-Means聚类算法是一种常用的无监督学习算法,事先不知道类别,自动将相似的对象归到同一簇中。其目的是将数据集中的样本分成若干个不同的簇,同一簇内的样本相似度较高,不同簇之间的样本相似度较低。
K-Means 聚类算法在各种领域和应用场景中都有广泛的应用,包括但不限于以下场景:

  • 市场细分:用于将客户分成不同的市场细分,以便针对每个市场细分制定特定的市场策略。

  • 图像分割:用于将图像中的像素分成不同的区域,以便在计算机视觉和图像处理中提取对象或特征。

  • 文本文档聚类:用于将文档按照主题或内容相似性进行聚类,以便进行文本分类或主题建模。

  • 金融分析:用于风险评估、股票市场分析和信用评分。

  • 推荐系统:用于将用户分为不同的群组,并为他们推荐个性化的产品或服务。

  • 医疗领域:用于疾病簇分析、影像分析、药物发现等。

K-Means 聚类是一种通用的无监督学习方法,适用于许多不同的数据分析和问题解决情况,尤其适用于数据的聚类和分组。

2.案例价值

本案例使用鸢尾花瓣长度(petal length)和花瓣宽度(petal width)作为特征进行K-Means聚类,并绘制出聚类结果。
同学们可以通过这个案例学习K-Means聚类分析的核心理论和算法工作原理,建立对K-Means聚类的深刻理解,也可以将K-Means知识应用于解决一个实际的聚类问题,深化理论与实际问题的联系。

3.案例实现

3.1数据介绍

本案例使用鸢尾花数据集,鸢尾花数据集来源于sklearn.datasets库,它包含了以下信息:

150条观测数据,每个数据代表一朵鸢尾花。

每个观测数据包括两个特征,无目标值,单位都是cm:

  • 花瓣长度(petal length)

  • 花瓣宽度(petal width)
    鸢尾花数据集展示如下:

import pandas as pd
data=pd.read_csv('data/iris.csv',delimiter=',')
print(data)

在这里插入图片描述

3.2 K-Means聚类算法原理

K-Means聚类(K-Means Clustering)是一种无监督学习算法,用于将数据点分为K个不同的簇,以便相似的数据点被分在同一簇内。

以下是K-Means聚类的步骤:

  • (1)初始化:开始时,选择K个初始中心点,通常是从数据集中随机选择的数据点。这些中心点将用于构建簇。
  • (2)分配数据点:对每个数据点,计算它与每个中心点之间的距离,通常使用欧氏距离或其他距离度量。将数据点分配到距离最近的中心点所在的簇。
  • (3)更新中心点:对每个簇,计算簇内所有数据点的平均值,以得到新的中心点。新的中心点代表了该簇的特征。
  • (4)迭代:重复步骤(2)和(3),直到满足停止条件,例如簇分配不再改变或达到预定的最大迭代次数。
  • (5)输出结果:K均值聚类完成后,数据点将被分为K个簇,每个簇有一个中心点。这些簇和中心点可用于数据分析、可视化和其他应用。

以下是K-Means聚类的相关公式:
K-Means聚类通常使用欧氏距离来度量数据点之间的距离,欧氏距离公式为:
欧氏距离 = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 欧氏距离=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2} 欧氏距离=(x2x1)2+(y2y1)2
其中,(x1, y1) 和 (x2, y2) 是两个数据点的坐标。
K-Means聚类的优化目标是最小化簇内平方和,也称为簇内误差平方和(Within-Cluster Sum of Squares, WCSS)。

WCSS是每个数据点与其所属簇中心点之间距离的平方之和。WCSS公式为:
W C S S = ∑ ( ∣ ∣ x − c ∣ ∣ 2 ) WCSS = ∑(||x - c||^2) WCSS=(∣∣xc2)
其中,x 是数据点,c 是该数据点所属簇的中心点。
K均值聚类通过调整中心点的位置,不断迭代,以减小WCSS,直到收敛到一个局部最小值。

总之,K均值聚类是一种经典的聚类算法,适用于各种数据分析和模式识别任务。它的目标是将数据点分为不同的簇,使得同一簇内的数据点相似,不同簇之间的数据点尽可能不相似。

3.3 K-Means代码实现

导入模块,若有哪些模块未安装,请使用pip安装,例如pickle未安装,安装示例:pip install pickle

from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import pickle

定义一个train函数,用来训练,主函数中调用train,并设置聚类个数为3个。


def train(K):
    # 加载鸢尾花数据集
    iris = load_iris()
    X = iris.data

    # 创建K均值聚类模型,n_clusters=聚类个数
    kmeans = KMeans(n_clusters=K, random_state=42,n_init='auto')

    # 训练模型
    kmeans.fit(X)
	
	# 使用pickle保存k-means算法
    pickle.dump(kmeans, open('model/model.pkl', 'wb'))

    # 获取每个数据点的簇标签
    labels = kmeans.labels_

    # 获取簇中心点
    cluster_centers = kmeans.cluster_centers_

    #获取聚类平方误差
    inertia = kmeans.inertia_
    print("聚类平方误差:",inertia)
    #原始数据位置图
    plt.scatter(X[:, 2], X[:, 3],label=' ')
    plt.xlabel(iris.feature_names[2])
    plt.ylabel(iris.feature_names[3])
    plt.title('Initial Data')
    plt.legend()
    plt.savefig('images/initial_data.png')

    # 聚类后可视化簇和簇中心点图
    plt.scatter(X[:, 2], X[:, 3], c=labels, cmap='viridis')
    plt.scatter(cluster_centers[:, 2], cluster_centers[:, 3], c='red', marker='x', s=200, label='Cluster Centers')
    plt.xlabel(iris.feature_names[2])
    plt.ylabel(iris.feature_names[3])
    plt.title('K-Means Clustering with Cluster Centers')
    plt.legend()

    # 保存图像为PNG文件
    plt.savefig('images/kmeans_clusters_with_centers.png')
    print("完成聚类!")

    img_path="images/kmeans_clusters_with_centers.png"

    return img_path


if __name__ == '__main__':
    train(3)

输出结果:聚类平方误差: 78.85144142614601

K-Means聚类前数据图如下所示:
在这里插入图片描述
K-Means聚类后数据图如下:
在这里插入图片描述

从预测结果看,K-Means聚类算法将3个类别分成了3个簇,每个簇有一个中心点,中心点是数据点所在簇的均值。

4.模型部署

代码目录结构与说明,请按以下目录结构创建文件夹:

|-- data: # 数据集文件夹 
|---- iris.csv  鸢尾花数据集 
|-- images: # 图片放置文件夹  
|-- model: 模型保存文件夹     
|---- model.pkl # 模型文件             
|-- K_means.py:K近邻算法文件

另外说明:
在train函数中,鸢尾花数据集使用iris = load_iris(),这一行代码就可以直接使用,无需下载保存,若想下载查看,我这里提供百度网盘链接,可以下载查看,文件大小为3kb。

源代码和数据集资源:
https://download.csdn.net/download/weixin_56869533/90490180

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小Z老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值