原帖地址:http://www.opencvchina.com/thread-749-1-1.html

k-means是一种聚类算法,这种算法是依赖于点的邻域来决定哪些点应该分在一个组中。当一堆点都靠的比较近,那这堆点应该是分到同一组。使用k-means,可以找到每一组的中心点。当然,聚类算法并不局限于2维的点,也可以对高维的空间(3维,4维,等等)的点进行聚类,任意高维的空间都可以。

上图中的彩色部分是一些二维空间点。上图中已经把这些点分组了,并使用了不同的颜色对各组进行了标记。这就是聚类算法要做的事情。

K-means算法:
这个算法的输入是:
1:点的数据(这里并不一定指的是坐标,其实可以说是向量)
2:K,聚类中心的个数(即要把这一堆数据分成几组)
      所以,在处理之前,你先要决定将要把这一堆数据分成几组,即聚成几类。但并不是在所有情况下,你都事先就能知道需要把数据聚成几类的。但这也并不意味着使用k-means就不能处理这种情况,下文中会有讲解。
把相应的输入数据,传入k-means算法后,当k-means算法运行完后,该算法的输出是:
1:标签(每一个点都有一个标签,因为最终任何一个点,总会被分到某个类,类的id号就是标签)
2:每个类的中心点。
     标签,是表示某个点是被分到哪个类了。例如,在上图中,实际上有4中“标签”,每个“标签”使用不同的颜色来表示。所有黄色点我们可以用标签0表示,所有橘色点可以用标签1来表示,等等。
主体算法分析
步骤1:得到数据集

在本文中,使用上图的二维坐标(x,y)向量为数据集。假设我们要将这些点聚成5类,即k=5。我们可以看出,有3个类离的比较远,有两个类离得比较近,几乎要混合在一起了。
      当然,数据集不一定是坐标,假如你要对彩色图像进行聚类,那么你的向量就可以是(b,g,r),如果使用的是hsv颜色空间,那还可以使用(h,s,v),当然肯定可以有不同的组合例如(b*b,g*r,r*b) ,(h*b,s*g,v*v)等等。
步骤2:产生初始的类中心
在本文中,初始的类的中心点是随机产生的。如上图的红色点所示,是本文随机产生的初始点。注意观察那两个离得比较近的类,它们几乎要混合在一起,看看算法是如何将它们分开的。
      类的初始中心点是随机产生的。算法会不断迭代来矫正这些中心点,并最终得到比较靠近真实中心点的一组中心点。当然,最终的结果不一定就是真实的那一组中心点,算法会尽量向真实的靠近。
步骤3:根据中心点,划分其他点的归属(归属于哪个类)

      每个点(除了中心点的其他点)都计算与5个中心点的距离,选出一个距离最小的(例如该点与第2个中心点的距离是5个距离中最小的),那么该点就归属于该类.上图是点的归类结果示意图.
步骤4:重新计算中心点
经过步骤3后,每一个中心center(i)点都有它的”管辖范围”,由于这个中心点不一定是这个管辖范围的真正中心点,所以要重新计算中心点,计算的方法有很多种,最简单的一种是,直接计算该管辖范围内所有点的均值,做为心的中心点new_center(i)。
      如果重新计算的中心点new_center(i)与原来的中心点center(i)的距离大于一定的阈值(该阈值可以设定),那么认为算法尚未收敛,使用new_center(i)代替center(i)(如图,中心点从红色点转移到绿色点),转步骤3;否则,认为算法已经收敛,则new_center(i)就是最终的中心点。
步骤5:结束

      现在,所有的中心都不再移动,即算法已经收敛。当然,也许这些中心点还没有达到你要的精度,由于计算这些中心点的准确性,会受初始中心点设置的影响。所以,如果初始中心设置的很糟糕,那么得出来的结果也会不理想。
问题及解决方法
使用k-means时,我们遇到了两个困难。
(1)在事先不知道要聚几类的情况下,该怎么办?
      可以从K=1开始,并且k值不断的增加,通常,随着k的增加,类中的方差会急剧的下降,当k达到一定大的时候,方差的下降会明显减慢(至于慢道何种程度,可以设阈值),此时,就选取到了最佳的k值。
(2)初始中心点的设定
      如果初始值没设置好,肯定也不能获得理想的聚类效果。针对这种情况,这里提供两种方法:随机的选取多组中心点,在每一组中心点上,都把kmeans算法运行一次。最后,在选取类间方差最小的一组。通过设定的选初始值方法(这里提供一种,当然自己也可以去构想其他的方法):
1:在数据集上随机选择一个点,做为第一个中心点;
2:在数据集上,选取离第一个中心点最远的一个点做为第二个中心点。
3:在数据集上,选取离第一个和第二个中心最远的点,做为第三个中心。
4:依此计算后续的中心点

转载于:https://www.cnblogs.com/mikewolf2002/p/3386755.html

Kmeans聚类算法分析(转帖)相关推荐

  1. K-Means 聚类算法分析客户群价值

    K-Means 算法是典型的基于距离的非层次聚类算法,在最小化误差函数的基础上将数据划分为预订的类树 K,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度越大. 度量样本之间的相似性最 ...

  2. 通过Kmeans聚类算法分析行业价格给商品定价

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.聚类算法--Kmeans 二.使用步骤 1.引入库 2.读入数据 3.数据检查及处理 4.聚类分析 总结 前言 电 ...

  3. python 3d绘图kmeans_Python爬虫与K-means聚类算法分析多数据图片主色方法

    玩蛇网python爬虫与数据分析,本文结合python爬虫与K-means算法的使用,来分析图片主基色.色彩斑斓的一张图片,哪种颜色是它的主色调呢?今天就来讲讲如何用Python爬虫与K-means聚 ...

  4. K-Means聚类算法Java实现

    K-Means聚类算法 目的:将数据分为K组 基本思路 随机选取K个对象作为初始的聚类中心 计算每个对象与各个聚类中心之间的距离,将每个对象分配给距离它最近的聚类中心 将属于同一类的对象求均值,将这个 ...

  5. scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

    ====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的 ...

  6. java iris_利用K-Means聚类算法实现对iris.data.ulab

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 利用K-Means聚类算法实现对iris.data.ulabel数据的聚类,这是在网上找到如果要换成我的iris.date iris.date.ulabl ...

  7. 使用Python,OpenCV,K-Means聚类查找图像中最主要的颜色

    Python,OpenCV,K-Means聚类查找图像中最主要的颜色 1. K-Means是什么? 2. 步骤 3. 效果图 4. 源代码 参考 对于肉眼来说,从一幅图中识别出主要颜色很容易.那怎么用 ...

  8. OpenCV3.3中K-Means聚类接口简介及使用

    OpenCV3.3中给出了K-均值聚类(K-Means)的实现,即接口cv::kmeans,接口的声明在include/opencv2/core.hpp文件中,实现在modules/core/src/ ...

  9. k均值聚类算法考试例题_一文读懂K-means聚类算法

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

最新文章

  1. 人类吃屎用屎指南:用做肥料不如制咖啡、当展品、做炸弹
  2. 《如何高效学习》读书笔记(一)——整体性学习策略
  3. 美团副总裁夏华夏:科技应该为每一个普通人服务,要做“接地气的AI” | MEET2021...
  4. Python推荐算法讲解
  5. TasksetManager冲突导致SparkContext异常关闭
  6. SAP MTA打包的一些常见错误
  7. css实用技巧:巧用css实现两栏等高布局
  8. TensorFlow中文社区
  9. 《2020数字中国指数报告》重磅发布,“上云”成产业数字化必选项
  10. PSP2000远程无线连接控制电脑
  11. 电子阅读器行业市场研究分析及未来趋势预测分析
  12. 将中文转化为GB2312编码
  13. 基于docker的wekan部署
  14. Python中三个双引号的作用是什么?
  15. 云计算——交换机基本原理与配置
  16. Mysql eighth week
  17. 苹果平板历史各版本 援引自知乎https://www.zhihu.com/question/315944330
  18. 北斗导航 | GBAS发展与应用支持CAT II/III类精密进近
  19. UI设计图的标注工具大比拼
  20. 2019年终总结——我度过了幸福的一年

热门文章

  1. 用ABAP代码读取S/4HANA生产订单工序明细
  2. [BTCC] 要“工程师”“工程师”“工程师”
  3. lua C交互函数注释
  4. Linux网络基础1
  5. nginx的读写分离
  6. Mysql5.5配置主从复制
  7. as3绘制抛物线(二)
  8. ArrayList使用方法
  9. Python多进程编程
  10. 102TimeStatistic