初学Mean Shift 聚类算法
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 聚类算法相关推荐
- 机器学习(十)Mean Shift 聚类算法
Mean Shift 聚类算法 原文地址:http://blog.csdn.net/hjimce/article/details/45718593 作者:hjimce 一.mean shift 算法 ...
- 均值漂移(mean shift )聚类算法Matlab实现详解
Mean shift 算法是基于核密度估计的爬山算法,可用于聚类.图像分割.跟踪等,其在声呐图像数据处理也有广泛的应用,笔者在网上找了一遍也没有找到关于Mean shift的matlab实现代码,找到 ...
- 【聚类算法】常见聚类算法总结
转自:https://blog.csdn.net/u010062386/article/details/82499777 感谢博主 1.常见算法 1.原型聚类 "原型"是指样本空间 ...
- 五种常见的聚类算法总结
目录 一.关于聚类的基础描述 1.1 聚类与分类的区别 1.2 聚类的概念 1.3 聚类的步骤 二.几种常见的聚类算法 2.1 K-means聚类算法 1) K-means算法的流程: 2)K- ...
- 【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现
[机器学习]聚类算法DBSCAN.K-means.Mean Shift对比分析及具体代码实现 一.DBSCAN算法(具有噪声的基于密度的聚类方法) 1.算法原理 基于数据分布密度不同对数据进行聚类,把 ...
- mean shift聚类matlab,meanshift目标跟踪源程序 meanshift跟踪算法MATLAB源码 - 下载 - 搜珍网...
压缩包 : MeanShift+深入详细(MatLab源码).rar 列表 MeanShift+深入详细(MatLab源码)/meanshift文章.PPT.word文档.基于meanshift的跟踪 ...
- a*算法的优缺点_五种聚类算法一览与python实现
大家晚上好,我是阿涛. 今天的主题是聚类算法,小结一下,也算是炒冷饭了,好久不用真忘了. 小目录: 1.K-means聚类2.Mean-Shift聚类3.Dbscan聚类4.层次聚类5.GMM_EM聚 ...
- [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 机器学习7—聚类算法之K-means算法
K-均值算法(K-means) 前言 聚类算法模型 常见的聚类算法 一.K-means算法描述 二.示例说明K-means算法流程 三.K-means算法中Kmean()函数说明 四.K-means算 ...
- 【Python机器学习】聚类算法任务,评价指标SC、DBI、ZQ等系数详解和实战演示(附源码 图文解释)
需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一.聚类任务 设样本集S={x_1,x_2,-,x_m}包含m个未标记样本,样本x_i=(x_i^(1),x_i^(2),-,x_i^(n))是一 ...
最新文章
- 关于某日访问次数最多的IP的topK问题的三种解法
- PS怎么将自己的形状存储为自定形状?
- HRBUST 2011【简单dp】
- Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信
- linux网络编程之网络字节序、主机字节序、大端、小端
- 对MySQL性能影响关系紧密的五大配置参数
- linux获取笔记本摄像头视频,如何在windows下用ffmpeg抓取笔记本电脑摄像头视频
- 项目管理最佳实践方法_项目管理最佳实践,企业如何进行有效的项目管理
- 平衡二叉树删除_AVL 平衡树
- IDL | 实验二、IDL语法基础
- 沧小海笔记之PCIE协议解析——第一章 PCIE概述(下)
- android switch背景图片,修改SwitchCompat的背景图片
- java web构建_使用Java构建一个宁静的Web服务
- Postman 批量执行请求
- java 支付宝退款、提现(单笔转账到支付宝账户接口)
- 《Oracle 10G 系统教程 中科院培训老师讲授》
- 电脑使用android手机摄像头,电脑怎么使用安卓手机摄像头 电脑使用手机摄像头的方法-电脑教程...
- Nodejs生成二维码图片文件
- 匈牙利离散(板子向)
- 解决360断网急诊强力修复后无法上网的问题