Mean Shift 聚类算法

原文地址:http://blog.csdn.net/hjimce/article/details/45718593 

作者:hjimce

一、mean shift 算法理论

Mean shift 算法是基于核密度估计的爬山算法,可用于聚类、图像分割、跟踪等,因为最近搞一个项目,涉及到这个算法的图像聚类实现,因此这里做下笔记。

(1)均值漂移的基本形式

给定d维空间的n个数据点集X,那么对于空间中的任意点x的mean shift向量基本形式可以表示为:

这个向量就是漂移向量,其中Sk表示的是数据集的点到x的距离小于球半径h的数据点。也就是:

而漂移的过程,说的简单一点,就是通过计算得漂移向量,然后把球圆心x的位置更新一下,更新公式为:

使得圆心的位置一直处于力的平衡位置。

总结为一句话就是:求解一个向量,使得圆心一直往数据集密度最大的方向移动。说的再简单一点,就是每次迭代的时候,都是找到圆里面点的平均位置作为新的圆心位置。

(2)加入核函数的漂移向量

这个说的简单一点就是加入一个高斯权重,最后的漂移向量计算公式为:

因此每次更新的圆心坐标为:

不过我觉得如果用高斯核函数,把这个算法称为均值漂移有点不合理,既然叫均值漂移,那么均值应该指的是权重相等,也就是(1)中的公式才能称之为真正的均值漂移。

我的简单理解mean shift算法是:物理学上力的合成与物体的运动。每次迭代通过求取力的合成向量,然后让圆心沿着力的合成方向,移动到新的平衡位置。

二、mean shift 聚类流程:

假设在一个多维空间中有很多数据点需要进行聚类,Mean Shift的过程如下:

1、在未被标记的数据点中随机选择一个点作为中心center;

2、找出离center距离在bandwidth之内的所有点,记做集合M,认为这些点属于簇c。同时,把这些求内点属于这个类的概率加1,这个参数将用于最后步骤的分类

3、以center为中心点,计算从center开始到集合M中每个元素的向量,将这些向量相加,得到向量shift。

4、center = center+shift。即center沿着shift的方向移动,移动距离是||shift||。

5、重复步骤2、3、4,直到shift的大小很小(就是迭代到收敛),记住此时的center。注意,这个迭代过程中遇到的点都应该归类到簇c。

6、如果收敛时当前簇c的center与其它已经存在的簇c2中心的距离小于阈值,那么把c2和c合并。否则,把c作为新的聚类,增加1类。

6、重复1、2、3、4、5直到所有的点都被标记访问。

7、分类:根据每个类,对每个点的访问频率,取访问频率最大的那个类,作为当前点集的所属类。

简单的说,mean shift就是沿着密度上升的方向寻找同属一个簇的数据点。

三、mean shift 聚类实现

Mean shift 算法不需要指定聚类个数,贴一下用matlab实现的聚类结果:

clc close all; clear profile on %生成随机数据点集 nPtsPerClust = 250; nClust = 3; totalNumPts = nPtsPerClust*nClust; m(:,1) = [1 1]'; m(:,2) = [-1 -1]'; m(:,3) = [1 -1]'; var = .6; bandwidth = .75; clustMed = []; x = var*randn(2,nPtsPerClust*nClust); for i = 1:nClustx(:,1+(i-1)*nPtsPerClust:(i)*nPtsPerClust) = x(:,1+(i-1)*nPtsPerClust:(i)*nPtsPerClust) + repmat(m(:,i),1,nPtsPerClust); end data=x'; % plot(data(:,1),data(:,2),'.')%mean shift 算法 [m,n]=size(data); index=1:m; radius=0.75; stopthresh=1e-3*radius; visitflag=zeros(m,1);%标记是否被访问 count=[]; clustern=0; clustercenter=[];hold on; while length(index)>0cn=ceil((length(index)-1e-6)*rand);%随机选择一个未被标记的点,作为圆心,进行均值漂移迭代center=data(index(cn),:);this_class=zeros(m,1);%统计漂移过程中,每个点的访问频率%步骤2、3、4、5while 1%计算球半径内的点集dis=sum((repmat(center,m,1)-data).^2,2);radius2=radius*radius;innerS=find(dis<radius*radius);visitflag(innerS)=1;%在均值漂移过程中,记录已经被访问过得点this_class(innerS)=this_class(innerS)+1;%根据漂移公式,计算新的圆心位置newcenter=zeros(1,2);% newcenter= mean(data(innerS,:),1); sumweight=0;for i=1:length(innerS)w=exp(dis(innerS(i))/(radius*radius));sumweight=w+sumweight;newcenter=newcenter+w*data(innerS(i),:);endnewcenter=newcenter./sumweight;if norm(newcenter-center) <stopthresh%计算漂移距离,如果漂移距离小于阈值,那么停止漂移break;endcenter=newcenter;plot(center(1),center(2),'*y');end%步骤6 判断是否需要合并,如果不需要则增加聚类个数1个mergewith=0;for i=1:clusternbetw=norm(center-clustercenter(i,:));if betw<radius/2mergewith=i; break;endendif mergewith==0 %不需要合并clustern=clustern+1;clustercenter(clustern,:)=center;count(:,clustern)=this_class;else %合并clustercenter(mergewith,:)=0.5*(clustercenter(mergewith,:)+center);count(:,mergewith)=count(:,mergewith)+this_class; end%重新统计未被访问过的点index=find(visitflag==0); end%结束所有数据点访问%绘制分类结果 for i=1:m[value index]=max(count(i,:));Idx(i)=index; end figure(2); hold on; for i=1:mif Idx(i)==1;plot(data(i,1),data(i,2),'.y');elseif Idx(i)==2;plot(data(i,1),data(i,2),'.b');elseif Idx(i)==3;plot(data(i,1),data(i,2),'.r');elseif Idx(i)==4;plot(data(i,1),data(i,2),'.k');elseif Idx(i)==5;plot(data(i,1),data(i,2),'.g');end end cVec = 'bgrcmykbgrcmykbgrcmykbgrcmyk'; for k = 1:clusternplot(clustercenter(k,1),clustercenter(k,2),'o','MarkerEdgeColor','k','MarkerFaceColor',cVec(k), 'MarkerSize',10) end

在图像分割、图像跟踪,需要加入核函数。

聚类结果                                                                                           圆心漂移轨迹

*********作者:hjimce     联系qq:1393852684   更多资源请关注我的博客:http://blog.csdn.net/hjimce                原创文章,转载请保留本行信息。*****************

机器学习(十)Mean Shift 聚类算法相关推荐

  1. 【火炉炼AI】机器学习023-使用层次聚类算法构建模型

    [火炉炼AI]机器学习023-使用层次聚类算法构建模型 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotli ...

  2. Machine Learning学习笔记(十)K-means聚类算法

    K-Means介绍 K-means算法是聚类分析中使用最广泛的算法之一.它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.其聚类 ...

  3. 【机器学习入门】深入浅出聚类算法!如何对王者英雄聚类分析,探索英雄之间的秘密...

    Datawhale 作者:小一,Datawhale优秀学习者 寄语:首先,对聚类算法进行了介绍:然后,解释了EM算法E步.M步的原理:最后,对sklearn参数进行了详解,并对王者荣耀英雄利用EM算法 ...

  4. Python数据挖掘与机器学习,快速掌握聚类算法和关联分析

    摘要:前文数据挖掘与机器学习技术入门实战与大家分享了分类算法,在本文中将为大家介绍聚类算法和关联分析问题.分类算法与聚类到底有何区别?聚类方法应在怎样的场景下使用?如何使用关联分析算法解决个性化推荐问 ...

  5. 《菜菜的机器学习sklearn课堂》聚类算法Kmeans

    聚类算法 聚类算法 无监督学习与聚类算法 sklearn中的聚类算法 KMeans KMeans是如何工作的 簇内误差平方和的定义和解惑 sklearn.cluster.KMeans 重要参数 n_c ...

  6. python机器学习案例系列教程——聚类算法总结

    全栈工程师开发手册 (作者:栾鹏) python教程全解 一.什么是聚类? 聚类(Clustering):聚类是一个人们日常生活的常见行为,即所谓"物以类聚,人以群分",核心的思想 ...

  7. dbscan算法_如何掌握用于机器学习的流行DBSCAN聚类算法

    总览 DBSCAN聚类是一种针对无监督学习问题而被低估但非常有用的聚类算法 了解DBSCAN集群如何工作,为什么要学习以及如何在Python中实现DBSCAN集群 介绍 掌握无监督学习为数据科学家开辟 ...

  8. 机器学习-Hierarchical clustering 层次聚类算法

    学习彭亮<深度学习基础介绍:机器学习>课程 假设有N个待聚类的样本,对于层次聚类来说,步骤: (初始化)把每个样本归为一类,计算每两个类之间的距离,也就是样本与样本之间的相似度: 寻找各个 ...

  9. 均值漂移(mean shift )聚类算法Matlab实现详解

    Mean shift 算法是基于核密度估计的爬山算法,可用于聚类.图像分割.跟踪等,其在声呐图像数据处理也有广泛的应用,笔者在网上找了一遍也没有找到关于Mean shift的matlab实现代码,找到 ...

最新文章

  1. Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤
  2. 网络安全系列之九 WAF的基本配置
  3. 简单枚举(算法竞赛入门经典)
  4. 【AC Saber】双指针
  5. TextView 多文字字体颜色及多事件监听
  6. 阿里腾讯今日头条纷纷翻牌子,ClickHouse到底有什么本事?
  7. Java 小记 — Spring Boot 的实践与思考,互联网 面试官 如何面试
  8. 各种格式的文件使用工具打开
  9. yii2 smarty php,YII2 整合smarty
  10. 捷速编辑pdf文件插入图片的方法
  11. 传智播客asp.net基础视频免费分享
  12. html拼凑成一张图片,(代码片段)利用canvas,把多张图合并成一张图片
  13. 双吉他伴奏配合的有关问题
  14. 【批量识别图片内容改名】如何批量识别图片中的文字并自动改名,如何根据图片上的文字内容重命名图片,批量的识别区域内容如何重命名改名,全部告诉你
  15. 7.Mapping详解
  16. 2017京东校招面试回忆(已成功拿到offer)
  17. linux centos7 镜像下载
  18. ThreadPoolExecutor 线程池的七个参数
  19. java 泛型方法 实例化_Java让泛型实例化的方法
  20. fabric中简单搭建区块链浏览器

热门文章

  1. 坦克世界 与服务器连接中断,坦克世界怎么老是显示与服务器连接已中断
  2. 许昌市襄县机器人_襄城县机器人自动码垛机生产工厂批发销售
  3. 如何设置mysql让其他人能访问_怎么设置MySQL就能让别人访问本机的数据库了?...
  4. android+多种行视图,android – 在react-native列表视图中显示多种类型行的正确方法是什么?...
  5. mysql5.5查询字段语句_mysql查询同一个字段下,不同内容的语句
  6. Myeclipse10 整合SSH过程(巨详细!!!)及出错笔记
  7. 疯狂软件mysql视频_疯狂软件MySql视频
  8. 多变量逻辑回归python_Python实现逻辑回归(Logistic Regression in Python)
  9. nxos启动的初始化和https访问nx-api
  10. c# 开发window服务