Kmeans均值聚类算法原理以及Python如何实现


Posted in Python onSeptember 26, 2020

第一步.随机生成质心

由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质心,什么时候这一堆点能够根据这两个质心分为两堆就对了。如下图所示:

Kmeans均值聚类算法原理以及Python如何实现

第二步.根据距离进行分类

红色和蓝色的点代表了我们随机选取的质心。既然我们要让这一堆点的分为两堆,且让分好的每一堆点离其质心最近的话,我们首先先求出每一个点离质心的距离。假如说有一个点离红色的质心比例蓝色的质心更近,那么我们则将这个点归类为红色质心这一类,反之则归于蓝色质心这一类,如图所示:

Kmeans均值聚类算法原理以及Python如何实现

第三步.求出同一类点的均值,更新质心位置

在这一步当中,我们将同一类点的x\y的值进行平均,求出所有点之和的平均值,这个值(x,y)则是我们新的质心的位置,如图所示:

Kmeans均值聚类算法原理以及Python如何实现

我们可以看到,质心的位置已经发生了改变。

第四步.重复第二步,第三步

我们重复第二步和第三部的操作,不断求出点对质心的最小值之后进行分类,分类之后再更新质心的位置,直到得到迭代次数的上限(这个迭代次数是可以我们自己设定的,比如10000次),或者在做了n次迭代之后,最后两次迭代质心的位置已经保持不变,如下图所示:

Kmeans均值聚类算法原理以及Python如何实现

这个时候我们就将这一堆点按照它们的特征在没有监督的条件下,分成了两类了!!

五.如果面对多个特征确定的一个点的情况,又该如何实现聚类呢?

首先我们引入一个概念,那就是欧式距离,欧式距离是这样定义的,很容易理解:

Kmeans均值聚类算法原理以及Python如何实现

很显然,欧式距离d(xi,xj)等于我们每一个点的特征去减去另一个点在该维度下的距离的平方和再开根号,十分容易理解。

我们也可以用另一种方式来理解kmeans算法,那就是使某一个点的和另一些点的方差做到最小则实现了聚类,如下图所示:

Kmeans均值聚类算法原理以及Python如何实现

得解!

六:代码实现

我们现在使用Python语言来实现这个kmeans均值算法,首先我们先导入一个名叫make_blobs的数据集datasets,然后分别使用两个变量X,和y进行接收。X表示我们得到的数据,y表示这个数据应该被分类到的是哪一个类别当中,当然在我们实际的数据当中不会告诉我们哪个数据分在了哪一个类别当中,只会有X当中数据。在这里写代码的时候比较特殊,make_blobs库要求我们必须接受这两个参数,不能够只接受X这个数据参数,代码如下

plt.figure(figsize=(15,15))#规定我们绘图的大小为12*12

X, y=make_blobs(n_samples=1600,random_state=170)#一共取用1600个sample,同时状态设定为随机
#不知道这个状态随机是什么意思,只能查有关这个库的官方文档,同时这个数据集规定了是具备三个数据中心,也就是三个簇
y_pred=KMeans(n_clusters=3,random_state=170).fit_predict(X)

plt.subplot(221)#表示四个方格当中的第一格
plt.scatter(X[:,0],X[:,1],c=y_pred)#表示数据的第0个和第1个维度,同时数据的colour与predict的结果有关
plt.title("The result of the Kmeans")

plt.subplot(222)#表示四个方格当中的第一格
plt.scatter(X[:,0],X[:,1],c=y)
plt.title("The Real result of the Kmeans")

array=np.array([[0.60834549,-0.63667341],[-0.40887178,-0.85253229]])
lashen=np.dot(X,array)
y_pred=KMeans(n_clusters=3,random_state=170).fit_predict(lashen)

plt.subplot(223)#表示四个方格当中的第一格
plt.scatter(lashen[:,0],lashen[:,1],c=y_pred)#表示数据的第0个和第1个维度,同时数据的colour与predict的结果有关
plt.title("The Real result of the tranfored data")

我们在使用scatter函数进行绘图的时候会根据我们数据结的形状来编写相应的代码,这里我们所拿到的X数据集的行数是我们所指定的1600行,因为我们一共拿到了1600个数据,每一个数据仅有两个特征,也就是在XY轴当中的坐标,因此X是一个二维的ndarray对象(X是numpy当中的ndarray对象),我们可以打印出来看看这个数据的构成,如下图所示:

Kmeans均值聚类算法原理以及Python如何实现

同时我们也可以看到y也是ndarray对象,由于我们在采集数据的时候仅仅接受了3个簇,make_blobs默认接受的是三个簇(或称cluster)的缘故,因此最后y的值只有0,1,2这三种可能。我们通过matplotlib绘图,绘制出我们分类的结果图,也就是上述代码的运行结果如下:

Kmeans均值聚类算法原理以及Python如何实现

以上就是Kmeans均值聚类算法原理以及Python如何实现的详细内容,更多关于Kmeans均值聚类算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
python机器学习实战之K均值聚类
Dec 20 Python
Python的SimpleHTTPServer模块用处及使用方法简介
Jan 22 Python
Python实现的购物车功能示例
Feb 11 Python
django 在原有表格添加或删除字段的实例
May 27 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
Jun 01 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
Jun 30 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
Jul 03 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 #Python
Python爬取股票信息,并可视化数据的示例
Sep 26 #Python
如何利用python发送邮件
Sep 26 #Python
Python 测试框架unittest和pytest的优劣
Sep 26 #Python
浅析python函数式编程
Sep 26 #Python
python用Configobj模块读取配置文件
Sep 26 #Python
Python内存泄漏和内存溢出的解决方案
Sep 26 #Python
You might like
php daodb插入、更新与删除数据
2009/03/19 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
javascript显示隐藏层比较不错的方法分析
2008/09/30 Javascript
JS获取当前网址、主机地址项目根路径
2013/11/19 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
C#实现将一个字符转换为整数
2017/12/12 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
python类装饰器用法实例
2015/06/04 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
实例详解Python模块decimal
2019/06/26 Python
Django使用Channels实现WebSocket的方法
2019/07/28 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
Python单元测试及unittest框架用法实例解析
2020/07/09 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
大学生毕业自荐信
2013/10/10 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
学习演讲稿范文
2014/05/10 职场文书
心理咨询承诺书
2014/05/20 职场文书
2015年质检工作总结
2015/05/04 职场文书
2019已经过半,你知道年中工作总结该怎么写吗?
2019/07/03 职场文书
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android