本案例将介绍算法的应用场景、案例价值、算法原理、代码讲解、算法实现、模型训练、模型保存、调用模型、模型预测,这几个方面进行讲解。本案例为机器学习算法,数据集较少,占用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}
欧氏距离=(x2−x1)2+(y2−y1)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=∑(∣∣x−c∣∣2)
其中,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