查看原文
其他

人工智能|Python实现K-means聚类算法的代码演示

陈鸥辉整理 信息科技时代 2024-03-15

原文地址:https://www.cnblogs.com/txx120/p/11487674.html

1. 概述

K-means聚类算法也称k均值聚类算法,是集简单和经典于一身的基于距离的聚类算法。它采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

2. 算法核心思想

K-means聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

3. 算法实现步骤

1、首先确定一个k值,即我们希望将数据集经过聚类得到k个集合。 

2、从数据集中随机选择k个数据点作为质心。

3、对数据集中每一个点,计算其与每一个质心的距离(如欧式距离),离哪个质心近,就划分到那个质心所属的集合。

4、把所有数据归好集合后,一共有k个集合。然后重新计算每个集合的质心。

5、如果新计算出来的质心和原来的质心之间的距离小于某一个设置的阈值(表示重新计算的质心的位置变化不大,趋于稳定,或者说收敛),我们可以认为聚类已经达到期望的结果,算法终止。

6、如果新质心和原质心距离变化很大,需要迭代3~5步骤。 

4. 算法步骤图解

 

上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图d所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。

K-means术语:
簇:所有数据的点集合,簇中的对象是相似的。
质心:簇中所有点的中心(计算所有点的中心而来)
5. K-means算法优缺点
优点:
1、原理比较简单,实现也是很容易,收敛速度快。
2、当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。
3、主要需要调参的参数仅仅是簇数k。
缺点:
1、K值需要预先给定,很多情况下K值的估计是非常困难的。
2、K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。
3、对噪音和异常点比较的敏感。用来检测异常值。
4、采用迭代方法,可能只能得到局部的最优解,而无法得到全局的最优解。

参考演示代码,陈老师对原代码进行了修改:

pip install sklearn -i https://pypi.tuna.tsinghua.edu.cn/先安装sklearn等库才能运行代码看演示效果。
#代码原址:https://jingyan.baidu.com/article/4d58d5415051009dd4e9c02f.htmlimport pandas as pdfrom sklearn.cluster import KMeansimport matplotlib.pyplot as pltdf=pd.DataFrame({'语文':[32,43,54,66,65,64,67,66,76,76,78,78,98,87,86,85,85,84,84,83,73,73,72,77,90,96,99,98,56,76,87,88,89,93,90,91,92,32], '数学':[43,45,55,98,78,54,89,24,60,98,44,96,90,67,87,89,98,87,87,67,66,65,45,34,54,87,77,88,99,66,76,75,74,73,74,78,77,65]})x=df.loc[:,['语文','数学']]#分数组对#--以下代码为求不同K值对应的聚类效果,K值对应可改--#cluster=KMeans(n_clusters=3).fit_predict(x)#k值设置为3,可以修改为数据对数以内的任何数值print(cluster)#分类结果plt.rcParams['font.sans-serif'] = ['SimHei']#设置中文字体plt.figure()plt.scatter(x['语文'],x['数学'],c=cluster)plt.xlabel("语文",fontsize=10)#x轴plt.ylabel("数学",fontsize=10)#y轴plt.title("K-means测试")#标题plt.show()#--以下代码为求不同K值对应的族内平方和的关系--#K = []Score=[]for k in range(1,38): kmeans=KMeans(n_clusters=k) kmeans.fit(x) y_pred=kmeans.predict(x) score=kmeans.inertia_ K.append(k) Score.append(score) print(k,'->',score)plt.rcParams['font.sans-serif'] = ['SimHei']plt.plot(K,Score,marker='o')plt.xlabel("k值",fontsize=10)plt.ylabel("族内平方和",fontsize=10)plt.show()

K=3的聚类结果,可以修改数值看K为其他值时的聚类效果,数据越多,聚类效果越明显,具体数据可以自行在代码中添加删减。

相关文章:

粤教版高中信息技术电子教材选择性必修4:《人工智能初步》2018人工智能+教育蓝皮书优质课系列:2019年的《情感分析--有温度的AI》2019年路宁宁的《蒙特卡罗算法》
2019年全国信息技术优质课李天宇的人工智能人工智能|选择性必修4《人工智能初步》课程学习资源推荐
理论及应用系列:人工智能知识体系与项目分析
放松一下|听一听人工智能创造的歌曲……
人工智能|专家系统介绍人工智能|2020年人工智能十大技术进展推荐|听二中初中部黄金老师的《初识人工智能》有感人工智能三大关键能力,终于有人讲明白了Python编程系列:人工智能|Python自动朗读并保存为声音文件人工智能|Python提取PDF中的文本并朗读
人工智能|第六章baidu-aip应用体验程序(四个)
人工智能|Python调用百度人脸对比检测体验
人工智能|Python一次进行多张照片的人脸比
继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存