KMeans算法实现步骤介绍及Python代码
文章目录
- 一、KMeans算法的步骤
- 二、KMeans实现过程中需要注意的地方
- 1.初始聚类中心的确定
- 2. 常用的距离度量
- 3. 聚类效果的衡量 SSE
- 4.迭代结束条件
- 5.空簇的处理
- 三、结果展示
- 1. 样本的聚类
- 2. 图片压缩
- 四、源码链接
- 五、KMeans++的实现
- 算法步骤
一、KMeans算法的步骤
- 对于给定的一组数据,随机初始化K个聚类中心(簇中心)
- 计算每个数据到簇中心的距离,并把该数据归为离它最近的簇。
- 根据得到的簇,重新计算簇中心。
- 对 2、3 进行迭代直至簇中心不再改变或者小于指定阈值。
二、KMeans实现过程中需要注意的地方
1.初始聚类中心的确定
在上面的步骤中,簇中心的选取尤为重要,它对最终的聚类影响较大。初始化簇中心常用的选取方法是从数据集中随机选取K个数据作为簇中心。
但是这种随机初始化簇中心导致了KMeans的缺点:聚类的结果不够稳定。
可以使用KMeans++来改进初始簇中心的选择。
2. 常用的距离度量
常用的距离度量可以使用欧氏距离:
点x到点y的距离
3. 聚类效果的衡量 SSE
在KMeans中,可以使用误差平方和( SSE )作为目标函数来衡量聚类效果的好坏。
下面是SSE的计算方法:
直观上理解,SSE越小,表示数据越接近它们的簇中心,聚类效果也就越好。
4.迭代结束条件
迭代结束的条件可以自己设置最大的迭代次数,或者让目标函数收敛(根据上面的SSE公式可以知道,目标函数收敛也就是簇中心几乎不再变化)。
5.空簇的处理
在随机初始化聚类中心的过程或迭代过程中可能会出现有的簇没有被分配到样本,这样的簇叫做空簇。在代码实现的过程中,出现空簇后再进行下一次簇中心迭代时会出现除零的问题。
下面举个例子
故意设置了簇中心位置来碰空簇的瓷,不然碰到空簇的概率属实有点低。。
图中左边四个菱形为初始化的4个簇中心。
根据步骤二来确定样本点所属的簇,从图上可以直观看出,绿色和红色的簇中心到样本点的距离要比蓝色和紫色的要大,因此就会导致没有样本点被分到绿色和红色的簇中。
在迭代求簇中点均值时就会报“除零”的错。
解决方法:可以选取离当前已知簇中心最远的点作为空簇的簇中心。因为
这样消除对当前SSE影响最大的点对SSE的影响(该点到该空簇簇中心的距离为0)
如果有多个空簇,反复进行上述过程即可。
解决空簇问题后的最终聚类结果:
三、结果展示
1. 样本的聚类
2. 图片压缩
用聚类进行图片压缩其实就是将图片的每个像素的像素值通过聚类来进行划分,然后将原有的像素的像素值用其聚类中心的像素值来代替。用这种方法来减少色彩种类并保持图片的大致轮廓,从而实现图片的压缩。
对灰度图:
对彩图:
你设置的簇中心数越多,像素或灰度就越丰富,也就越能接近原图,但是这反而会让图片占用空间变大,因此在图片压缩时要对K值得有一个合理的考量。
四、源码链接
源码链接
五、KMeans++的实现
KMeans++相较于KMeans就在于改良了初始簇中心的选择方式,
其思想是:选择相距较远的样本点作为簇中心而非随机选取样本点
以此来加强聚类的稳定性。
算法步骤
- 从样本集中随机选取一个样本作为第一个簇中心
- 然后计算所有点到离它最近的簇中心的距离D(x)
- 再选择一个新的样本作为新的簇中心,选择的原则是:D(x)较大的点, 被选取作为簇中心的概率较大(不直接取D(x)最大的点作为簇中心主要是为了防止噪声的干扰)
- 重复2、3直至K个初始簇中心被选出
- 执行KMeans算法的后续步骤
代码的重点实现主要是如何选取D(x)较大的样本。
一种实现方法是计算所有样本的D(x)总和(记作sum(D(x))),然后随机选取0 到 sum(D(x))之间的一个数(记作 randDis),再计算RandDis−=D(x),直至RandDis<=0,选取D(x)对应的样本点作为簇中心。
上面的方法可以这么理解:有一条按D(x)划分区域的长度为sum(D(x))的带子,现在在带子上随机打一个点,点打在D(x)较大的区域的概率也就较大。而D(x)较大的区域也就是我们要找的新的簇中心。
KMeans算法实现步骤介绍及Python代码相关推荐
- 数据结构之平衡树:红黑树的介绍与Python代码实现——17
红黑树的介绍与Python代码实现 红黑树的介绍 红黑树(Red-Black Tree)是一种平衡二叉查找树,它是一种以比较简单的方式实现的2-3查找树 红黑树基于2-3查找树的表现 红链接:将两个2 ...
- kmeans 具体应用基站分配和Python代码
KMeans聚类算法,简短易懂的python代码 - 知乎 代码是抄的知乎 import numpy as np import random import matplotlib.pyplot as p ...
- 【负荷预测】基于灰色预测算法的负荷预测(Python代码实现)
目录 1 概述 2 流程图 3 入门算例 4 基于灰色预测算法的负荷预测(Python代码实现) 1 概述 "由于数据列的离散性,信息时区内将出现空集(不包含信息的定时区),因此只能按近似 ...
- 数据结构之并查集:并查集的介绍与Python代码实现——18
并查集的介绍 并查集(Union-find)数据结构也称作合并查找集(Merge-find set)或者不相交集数据结构(disjoint-set data structure),它是一种记录了由一个 ...
- pythonsort函数时间复杂度_合并排序算法——时间复杂度详解和python代码实现
递归形式 递归形式是算法中常用到的一种构造思路.递归允许函数或过程对自身进行调用,是对算法中重复过程的高度概括,从本质层面进行刻画,避免算法书写中过多的嵌套循环和分支语法.因此,是对算法结构很大的简化 ...
- 【强化学习】Sarsa算法求解悬崖行走问题 + Python代码实战
文章目录 一.Sarsa算法简介 1.1 更新公式 1.2 预测策略 1.3 详细资料 二.Python代码实战 2.1 运行前配置 2.2 主要代码 2.3 运行结果展示 2.4 关于可视化寻路过程 ...
- 【强化学习】Q-Learning算法求解悬崖行走问题 + Python代码实战
文章目录 一.Q-Learning算法简介 1.1 更新公式 1.2 预测策略 1.3 详细资料 二.Python代码实战 2.1 运行前配置 2.2 主要代码 2.3 运行结果展示 2.4 关于可视 ...
- Dijkstra 路径规划算法原理详解及 Python 代码实现
荷兰数学家 E.W.Dijkstra 于 1959 年提出了 Dijkstra 算法,它是一种适用于 非负权值 网络的 单源最短路径算法,同时也是目前求解最短路径问题的理论上最完备.应用最广的经典算法 ...
- 麻雀优化算法 优化XGBoost的参数 python代码
文章目录 麻雀优化算法 麻雀优化算法的改进 加入Ten混沌序列 XGBoost原理 麻雀优化算法优化XGBoost 参数范围 部分代码 画图 优化结果 评价结果和运行时间 适应度曲线 训练集结果 测试 ...
最新文章
- [LeetCode] Add Digits
- 小马智行最新估值曝光
- sersync2 完全安装配置说明(三) ----插件基本配置和使用
- python 日志不会按照日期分割_python实现日志按天分割
- 类别不平衡问题 —— 各种评估指标
- loj2090. 「ZJOI2016」旅行者
- Servlet 服务器 HTTP 响应
- js获取前一天/后一天
- 有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?...
- javascript widget ui mvc
- java实现倒计时源码分享
- add a redfish schema
- [收藏]使用GDI+绘制高质量图和字体
- 简单分析一个通过 js 劫持进行案例
- git已经设置了name和email但是还是提示please tell who you are
- 运行jar包出现问题:java.lang.SecurityException: JCE cannot authenticate the provider BC
- Anaconda创建虚拟环境以及常用的环境操作概念指令
- BIM二级考试第17期第一题用revit2016系统库中现场浇筑楼梯平台的bug
- 如何在html页面中插入flash透明背景
- 常用电子面单接口API及对接方式
热门文章
- linux移动或重命名命令,Linux移动文件或重命名的命令是什么
- 凤姐、兽一兽、王然三个80后女孩的不同人生
- JavaScript 正则匹配字符串中 base64 图片
- 将form表单提交文件修改为ajax提交
- python计算职工工资调整,关于Python 3:Python 3-实现一个函数来计算小时工资和工作小时数...
- 啤酒瓶洗瓶机设计(论文 CAD图纸 开题报告 任务书 答辩PPT)
- 关于时间date的加减运算的处理
- vue03-webpack配置
- 案例16:Java音乐网站系统设计与实现开题报告
- Linux运维面试题-03