目录

  • 1、算法步骤
  • 2、详细过程
  • 3、流程图
  • 4、聚类过程示意图
  • 5、测试效果
  • 6、算法优化

  K-means算法的基本思想是:以空间中个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。

1、算法步骤

  输入:聚类个数,以及包含个数据对象的数据集
  输出:满足方差最小标准的个聚类
  Step1 从个数据对象任意选择个对象作为初始聚类中心;
  Step2 根据簇中对象的平均值,将每个对象重新赋给最类似的簇;
  Step3 更新簇的平均值,即计算每个簇中对象的平均值;
  Step4 循环Step2到Step3直到每个聚类不再发生变化为止。

2、详细过程

  1) 给定大小为 nnn 的数据集,令 iter=1iter=1iter=1,表示迭代次数,选择 kkk 个初始聚类中心 zj(iter),j=1,2,…,kz_{j}(iter),j=1,2,\dots,kzj​(iter),j=1,2,…,k ;
  2) 计算每个样本数据 xi,i=1,2,…,nx_{i},i=1,2,\dots,nxi​,i=1,2,…,n 与聚类中心的距离,将 xix_{i}xi​ 分配给最近的聚类中心 zj(iter)z_{j}(iter)zj​(iter) 所属的聚类,即 ∣xi−zj(iter)∣≤∣xi−zj′(iter)∣,j′≠j,j′,j∈(1,2,….k)\vert x_{i}-z_{j}(iter)\vert \leq \vert x_{i}-z_{j^{'}}(iter)\vert,j^{'}\neq j,j^{'},j \in(1,2,\dots.k)∣xi​−zj​(iter)∣≤∣xi​−zj′​(iter)∣,j′​=j,j′,j∈(1,2,….k);
  3) 令 iter=iter+1iter=iter+1iter=iter+1,计算新的聚类中心(取已聚类的平均值)和误差平方和准则 FFF (目标函数)值
F(iter)=∑j=1k∑i=1n∥xij−zj(iter)∥2F(iter)=\sum_{j=1}^{k}\sum_{i=1}^{n}\Vert x_{i}^{j}-z_{j}(iter)\Vert^{2}F(iter)=j=1∑k​i=1∑n​∥xij​−zj​(iter)∥2
  4) 判断:若 ∣F(iter+1)−F(iter)∣<θ\vert F(iter+1) - F(iter) \vert<\theta∣F(iter+1)−F(iter)∣<θ (FFF 收敛) 或者对象无类别变化,则算法结束,否则,返回第 2)步。

3、流程图

4、聚类过程示意图

(和测试效果图无关,只是为了展示)

5、测试效果

6、算法优化

   由于随机聚类中心的不同,在最小化代价函数时,有可能会停留在一个局部最小值处,导致最终的聚类效果不佳。需要对初始化质心点的选择进行优化。
   优化:选择批次距离尽可能远的 kkk 个点(事先确定的类簇个数),首先随机选择一个点作为第一个初始类簇中心点,然后选择距离该点最远的那个点作为第二个初始类簇中心点,然后再选择距离前两个点的最近距离最大的点作为第三个初始类簇的中心点,以此类推,直至选出 kkk 个初始类簇中心点。
   下面是优化后初始质心点选择的代码部分(所用语言C#):

DataPoint firstCenterPoint = new DataPoint(dataSet[0].X, dataSet[0].Y, 1); //选择第一个点作为第一个随机点
int n = 2;
centerPoints.Add(firstCenterPoint);
for (int i = 0; i < k - 1; ++i, ++n)
{List<double> tempList = new List<double>();for (int j = 0; j < len; ++j){bool brFlag = false;for (int m = 0; m < centerPoints.Count(); ++m){if (dataSet[j].X == centerPoints[m].X && dataSet[j].Y == centerPoints[m].Y){brFlag = true;break;}}  if (brFlag){tempList.Add(0);continue;}List<double> ceterPointSd = new List<double>();for (int m = 0; m < centerPoints.Count(); ++m){double tempSd = Math.Sqrt(SquareDistance(dataSet[j], centerPoints[m]));ceterPointSd.Add(tempSd);}double minSd = ceterPointSd.Min();tempList.Add(minSd);}int maxIndexValue = tempList.Select((m, index) => new { m, index }).Where(x => x.m == tempList.Max()).FirstOrDefault().index;DataPoint centerPoint = new DataPoint(dataSet[maxIndexValue].X, dataSet[maxIndexValue].Y, n);centerPoints.Add(centerPoint);
}

通俗易懂的 k-means 聚类算法原理及优化(附代码)相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  3. 手把手教你在多种无监督聚类算法实现Python(附代码)

    来源: 机器之心 本文约2704字,建议阅读6分钟. 本文简要介绍了多种无监督学习算法的 Python 实现,包括 K 均值聚类.层次聚类.t-SNE 聚类.DBSCAN 聚类. 无监督学习是一类用于 ...

  4. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  5. python(scikit-learn)实现k均值聚类算法

    k均值聚类算法原理详解 示例为链接中的例题 直接调用python机器学习的库scikit-learn中k均值算法的相关方法 from sklearn.cluster import KMeans imp ...

  6. 基于 K-means 聚类算法实现图像区域分割matlab代码

    1 简介 对图像进行颜色区域分割.将图像转换到CIE L*a*b颜色空间,用K均值聚类分析算法对描述颜色的a*和b*通道进行聚类分析;通过提取各个颜色区域独立成为单色的新图像,对图像进行分割处理.实验 ...

  7. 【图像分割】基于 K-means 聚类算法实现图像区域分割matlab代码

    1 简介 对图像进行颜色区域分割.将图像转换到CIE L*a*b颜色空间,用K均值聚类分析算法对描述颜色的a*和b*通道进行聚类分析;通过提取各个颜色区域独立成为单色的新图像,对图像进行分割处理.实验 ...

  8. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  9. k均值聚类算法案例 r语言iris_K-means算法原理

    聚类的基本思想 俗话说"物以类聚,人以群分" 聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中.簇内 ...

  10. 计算机视觉面试考点(14)K均值聚类算法(K-Means)

    计算机视觉工程师在面试过程中主要考察三个内容:图像处理.机器学习.深度学习.然而,各类资料纷繁复杂,或是简单的知识点罗列,或是有着详细数学推导令人望而生畏的大部头.为了督促自己学习,也为了方便后人,决 ...

最新文章

  1. 《ActionScript 3.0权威指南》阅读笔记
  2. B 站神曲damedane:精髓在于换脸,五分钟就能学会
  3. mbr备份以及破坏后如何恢复
  4. Flask + Nginx + React + Webpack 配置解决跨域问题
  5. Java-Map从入门到性能分析2【HashMap的底层原理、构造方法优化、常用方法】
  6. QT的QIcon类的使用
  7. Linux 网络编程 TCP/UDP编程
  8. 中蒙联合考古队发现青铜时代至清代岩画图案
  9. Android之 APP创建或删除快捷方式
  10. win10 配置 java8
  11. 蚂蚁金融科技:两大发布,实力开放
  12. 人生的三把钥匙,太经典了!
  13. 再读《投资中最简单的事》
  14. 《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
  15. 英语词性-句子成分-构词法
  16. python 创建虚拟环境报错
  17. D. Lucky Chains(gcd + 线性筛)
  18. EasyExcel增加下拉选择框
  19. 贪心绝对值不等式-货仓选址
  20. crontab 每5秒钟执行一次

热门文章

  1. 性格测试c语言程序,性格测试的题目及答案
  2. 微软拼音输入法不显示选字栏怎么办?
  3. win11系统右键菜单改回以往风格(亲测有效)
  4. php jwplayer mp4,jwplayer6 和 php播放视频
  5. 简洁明了的个人求职简历如何写?
  6. ios迅雷php格式,2019最新最全iOS迅雷文件提取方法
  7. XUI 熟练使用之(二) -----------轮播条( BannerLayout 的使用)
  8. 第 42 章 RTC—实时时钟
  9. function函数
  10. java rest 知乎_JavaWeb开发之模仿知乎首页完整代码