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面向对象特殊成员
Apr 24 Python
python中类变量与成员变量的使用注意点总结
Apr 29 Python
python实现K最近邻算法
Jan 29 Python
python3使用QQ邮箱发送邮件
May 20 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
Python将string转换到float的实例方法
Jul 29 Python
python实现FTP循环上传文件
Mar 20 Python
python实现邮件循环自动发件功能
Sep 11 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 Python
Python机器学习应用之工业蒸汽数据分析篇详解
Jan 18 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和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
浅析get与post的一些特殊情况
2014/07/28 PHP
php中spl_autoload详解
2014/10/17 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
关于jquery form表单序列化的注意事项详解
2017/08/01 jQuery
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
3分钟了解vue数据劫持的原理实现
2019/05/01 Javascript
详解Jest结合Vue-test-utils使用的初步实践
2019/06/27 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
weui上传多图片,压缩,base64编码的示例代码
2020/06/22 Javascript
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
举例区分Python中的浅复制与深复制
2015/07/02 Python
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
Python tcp传输代码实例解析
2020/03/18 Python
Python虚拟环境venv用法详解
2020/05/25 Python
Python如何定义接口和抽象类
2020/07/28 Python
使用jquery实现HTML5响应式导航菜单教程
2014/04/02 HTML / CSS
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
会计学个人自荐信模板
2013/12/13 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
Hive日期格式转换方法总结
2022/06/25 数据库
Python+pyaudio实现音频控制示例详解
2022/07/23 Python