mean shift

article/2025/11/6 16:32:38

参考:
http://blog.csdn.net/google19890102/article/details/51030884
http://www.cvvision.cn/5778.html
https://wenku.baidu.com/view/5862334827d3240c8447ef40.html
http://blog.csdn.net/qq_23968185/article/details/51804574
https://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html
https://www.zhihu.com/question/27301358
https://www.zybang.com/question/3797fbcae06ac70f5071ff1ee42f23e2.html

1 mean shift 原始形式

mean shift介绍

mean shift是一种聚类算法,又称为均值漂移算法,在聚类,图像平滑、分割以及视频跟踪等方面有广泛的应用。Mean Shift的概念最早是由Fukunage在1975年提出的。

mean shift原始形式

原始形式为这里写图片描述(1),其中x表示高维球形的球心,xi表示各个向量点,K表示落在高维球形中的向量点的个数。这个向量就是漂移向量,其中Sk指的是一个半径为h的高维球区域。也就是:这里写图片描述。从公式(1)中也可以看出,原始的mean shift不过就是对球心内所有向量进行了合成,因为我们知道这里写图片描述,最终的mean shift向量就是这些下图用黑线表示向量的和。就像力的合成一样,合力的方向由所有力的方向共同决定。
当我们求得Mh(x)以后,我们即对x进行更新这里写图片描述(2),从而得到一个新的球心。在这个过程中,球心会一直向数据点集中的地方移动,换句话说球心会朝着数据集密度最大的方向移动。如此反复,最终球心x会收敛到一个固定值。

原始形式伪代码

该过程的伪代码可以表达成下面几句话,给大家一个整体认识该算法的角度。总得来说,该算法以每一个样本点作为窗口的中心点,再寻得最终中心点,最终中心点相同的样本点就是同一类。
重复移动直至收敛{
对每一个数据点,固定一个窗口(数据范围):
计算窗口内数据的中心;
移动窗口至新的中心

用图像解释mean shift过程

我们用二维图像上的点来解释上面的过程。
这里写图片描述
首先我们选定初始点为蓝色点(圆心),然后定义h的长度,我们发现一旦h定义完毕之后,那么蓝色的圆也就确定了,我们利用公式(1)计算Mh(x)并利用此来更新圆心x,得到新的圆心即黑色点,然后以黑色点为圆心,h为半径确定一个新的圆,再利用公式(1)求Mh,……如此往复,最终圆心x会收敛在一个固定的值,也就是概率密度最大的地方。更多的图像来形象地表达上述文字,如下。
黄色箭头即为平均的偏移向量Mh(x),指向样本分布最多的区域,也就是概率密度函数的梯度方向。
(1)初始化一个圆心蓝色点和h,计算出Mh(x)
这里写图片描述
(2)利用这里写图片描述进行更新,形象地看就是蓝色点在黄色箭头方向上移动到了黄色点。
这里写图片描述
(3)将黄色点作为新的圆心,计算出新的Mh(x),并更新圆心。
这里写图片描述
(4)如(3)同样的处理。
这里写图片描述
(5)最终圆心收敛到黄色点。
这里写图片描述
mean shift的基本思想就讲解完毕了。

时间复杂度

n 是样本点数, T 是迭代次数. 一般mean shift 在计算时间上开销很大,时间复杂度为,O(Tn^2)。

原始形式的不足

这样的一种原始形式的Mean Shift形式存在一个问题:在上面Mean Shift向量的计算过程中我们并没有考虑距离因素,即只要两个采样点在均值向量方向上的投影相等,则它们对Mean Shift向量计算的贡献就一样。从公式(1)我们也会发现,由于K是一个常数,所以每个向量的权重是一样的,即每一个点对圆心x的贡献是一样的。而实际上,这种贡献与x到每一个点xi之间的距离是相关的。

2 预备知识

核函数

核函数也叫窗口函数,在核估计中起到平滑的作用。常用的核函数有:Uniform,Epannechnikov,Gaussian等。下面是wiki上核函数的定义(截图别人的blog,感谢作者)
这里写图片描述
这里写图片描述

核密度估计

核密度估计是一种通过非参数估计来估计变量的概率密度函数的方法,通常也被称为是Parzen窗技术。对于一维的密度函数的核密度估计公式为这里写图片描述这里写图片描述,扩展到d维下的密度函数的估计用核密度估计时就为这里写图片描述,d为x的维数,h是窗口大小。

3 mean shift改进

再后来由Yizong Cheng对其进行扩充,主要提出了两点的改进:
1)定义了核函数;
2)增加了权重系数。
具体地说,核函数的定义使得偏移值对偏移向量的贡献随之样本与被偏移点的距离的不同而不同。权重系数使得不同样本的权重不同。所以Mean Shift中引入kernel的初衷是:随着样本与被偏移点的距离不同,其偏移量对Mean Shift向量的贡献也不同。我们先来看看核函数的定义。

带有核函数的公式

在原始的mean shift加入核函数,meanshift算法变为这里写图片描述(3.1),其中参数的意思为K()表示核函数,h为半径,这里写图片描述为单位密度,如果想(3.1)中的f得到最大值,我们可想到的方法就是对公式(3.1)求导。得到这里写图片描述(3.2)
令g(x) = - k’(x);k(x)叫做g(x)的影子核,名字听上去听深奥的,也就是求导的负方向,那么上式可以表为
这里写图片描述(3.3)
公式(3.3)中的第二项为meanshift向量,即这里写图片描述;要使得公式(3.3)为0,当且仅当这里写图片描述,此时求出新的中心点坐标为这里写图片描述(3.4)

meanshift算法流程

  1. 选择空间中x为圆心,以h为半径为半径,做一个高维球,落在所有球内的所有点xi
  2. 计算这里写图片描述,如果这里写图片描述<ε(人工设定),推出程序。如果这里写图片描述>ε, 则利用(3.4)计算x,返回1.

http://chatgpt.dhexx.cn/article/boP5Yg3t.shtml

相关文章

机器学习算法原理与实践(二)、meanshift算法图解以及在图像聚类、目标跟踪中的应用

【原创】Liu_LongPo 转载请注明出处 【CSDN】http://blog.csdn.net/llp1992 最近在关注跟踪这一块的算法&#xff0c;对于meanshift的了解也是来自论文和博客&#xff0c;本博客将对meanshift算法进行总结&#xff0c;包括meanshift算法原理以及公式推导&#xff0c;图解&…

基于MeanShift的目标跟踪算法及实现

这次将介绍基于MeanShift的目标跟踪算法&#xff0c;首先谈谈简介&#xff0c;然后给出算法实现流程&#xff0c;最后实现了一个单目标跟踪的MeanShift算法【matlab/c两个版本】 csdn贴公式比较烦&#xff0c;原谅我直接截图了… 一、简介 首先扯扯无参密度估计理论&#xff0c…

聚类算法:Mean Shift

目录 简介 mean shift 算法理论 Mean Shift算法原理 算法步骤 算法实现 其他 聚类算法之Mean Shift Mean Shift算法理论 Mean Shift向量 核函数 引入核函数的Mean Shift向量 聚类动画演示 Mean Shift的代码实现 算法的Python实现 scikit-learn MeanShift演示 s…

meanshift算法通俗讲解

这几天学习《学习OpenCV》中的第十章运动跟踪&#xff0c;里面讲到了meanshift算法&#xff0c;根据书上所讲实在难以理解&#xff0c;meanshift在运动跟踪这个过程中到底起到什么作用&#xff0c;于是经过几天不断地看相关资料和别人的博客文章&#xff0c;慢慢思路清晰了&…

机器学习实验 - MeanShift聚类

目录 一、报告摘要1.1 实验要求1.2 实验思路1.3 实验结论 二、实验内容2.1 方法介绍2.2 实验细节2.2.1 实验环境2.2.2 实验过程2.2.3 实验与理论内容的不同点 2.3 实验数据介绍2.4 评价指标介绍2.5 实验结果分析 三、总结及问题说明四、参考文献附录&#xff1a;实验代码 报告内…

聚类 之 MeanShift

文章目录 Meanshift 聚类基本原理Meanshift 聚类流程简述实例演示MeanShift聚类简易应用示例总结拓展阅读 上篇博客介绍了基于距离的K-Means聚类&#xff0c;这次给大家推荐一个基于密度的聚类算法&#xff1a;Meanshift&#xff08;均值漂移&#xff09;。 Meanshift 聚类基本…

Muduo源码剖析

1、总体流程 1. acceptor 进行listen阶段后&#xff0c; 往channel中注册可读事件。 2. acceptor可读处理中生成TcpConnection指针&#xff0c;通过EventloopThreadPool 轮询出其中一个线程的eventloop, 并将此TcpConnection的可读、可写等事件注册到自己Channel&#xff08;ev…

Muduo - Reactor模式

Muduo - Reactor模式 一、Reactor 是什么 wiki的中文定义&#xff1a;Reactor模式是事件驱动的&#xff0c;有一个或多个并发输入源&#xff0c;有一个Service Handler&#xff0c;有多个Request Handler&#xff0c;这个Service Handler会同步的将输入的请求&#xff08;Even…

muduo网络库——ThreadPool

模型 源码分析 1&#xff09;接口 class ThreadPool : noncopyable {public:typedef std::function<void ()> Task;explicit ThreadPool(const string& nameArg string("ThreadPool"));~ThreadPool();void setMaxQueueSize(int maxSize) { maxQueueSize…

muduo网络库——Channel

模型 实现流程&#xff1a; 前面已经介绍了EPoller类&#xff0c;EPoller主要监听的是Channel对象&#xff0c;每一个Channel对象会绑定一个文件描述符&#xff08;fd_&#xff09;&#xff0c;fd_上绑定要监听的事件。当epoll监听到就绪事件时&#xff0c;会将就绪事件添加到…

muduo源码分析之Buffer

这一次我们来分析下muduo中Buffer的作用&#xff0c;我们知道&#xff0c;当我们客户端向服务器发送数据时候&#xff0c;服务器就会读取我们发送的数据&#xff0c;然后进行一系列处理&#xff0c;然后再发送到其他地方&#xff0c;在这里我们想象一下最简单的EchoServer服务器…

从实例看muduo网络库各模块交互过程

文章目录 muduo网络库的核心代码模块各模块功能解释ChannelPollerEpollPoller EventLoopEventLoopThreadEventLoopThreadPoolTcpServerTcpConnection 从实际应用出发 muduo网络库的核心代码模块 1、channel 2、Poller 和它的子类 EpollPoller 3、EventLoop 4、Thread、EventLo…

muduo总结

本文重点在muduo TcpServer的启动&#xff0c;I/O线程池的启动&#xff0c;以及各种回调 文章目录 baseAsyncLogging.{h,cc}Atomic.hBlockinQueue.hBoundedBlockinQueue.hCondition.hcopyable.hCountDownLatch.{h,cc}Date.{h,cc}Exception.{h,cc}Logging.{h,cc}Mutex.hProcess…

muduo网络库——日志处理

测试程序 #include "muduo/base/AsyncLogging.h" #include "muduo/base/Logging.h" #include "muduo/base/Timestamp.h"#include <stdio.h> #include <sys/resource.h> #include <unistd.h>off_t kRollSize 500*1000*1000;m…

Muduo日志模块详解

Muduo日志模块解析 图片取自muduo网络库源码解析(1):多线程异步日志库(上)_李兆龙的技术博客_51CTO博客也是很好的日志讲解博客,这篇讲解流程基本上和它差不多,并且写的比我条理清楚很多 AppendFile::append() 这个函数是日志写入文件的最终函数,并且AppendFile这个类里面也是…

Muduo 定时器

TimeQueue定时器 图片转载自:muduo网络库源码解析(4):TimerQueue定时机制_李兆龙的技术博客_51CTO博客 添加新的定时器 TimerId TimerQueue::addTimer(TimerCallback cb, //用户自定义回调Timestamp when, //定时器的超时时刻double interval) //重复触发间隔,小于0则不重…

《muduo网络库》学习笔记——muduo学习总结

muduo是基于非阻塞的IO和事件驱动的网络库&#xff08;Reactor模式&#xff09;&#xff0c;其核心是一个事件循环EventLoop&#xff0c;用于响应计时器和IO事件。muduo采用基于对象&#xff08;object-based&#xff09;而非面向对象&#xff08;object-oriented&#xff09;的…

Ubuntu安装muduo库

1. 首先安装boost库&#xff1b; sudo apt-get update sudo apt-get install libboost-all-dev 2. 下载muduo库&#xff0c; https://github.com/chenshuo/muduo 3. 解压后进入解压目录&#xff0c;vim CMakeLists.txt&#xff0c;注释掉略过unit_test测试用例代码的编译&#…

linux muduo 编译安装,muduo记录

1.muduo编译安装 编译muduo遇见的报错可以在github上的issue上面查找。一般都能顺利解决,我遇到的就是没有安装boost-dev. centos7系统 执行: sudo yum install boost-dev 2.截取流程图 图片截取自《Linux多线程服务端编程&#xff1a;使用muduo C网络库》 3.源码摘录 摘录一个…

muduo源码分析之TcpServer模块

这次我们开始muduo源代码的实际编写&#xff0c;首先我们知道muduo是LT模式&#xff0c;Reactor模式&#xff0c;下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有一个主反应堆mainReactor以及几个子反应堆subReactor&#xff0c;其中子反应…