mean shift聚类matlab,机器学习:Mean Shift聚类算法

article/2025/11/6 16:01:14

今天的文章介绍如何利用Mean Shift算法的基本形式对数据进行聚类操作。而有关Mean Shift算法加入核函数计算漂移向量部分的内容将不在本文讲述范围内。实际上除了聚类,Mean Shift算法还能用于计算机视觉等场合,有关该算法的理论知识请参考这篇文章。

Mean Shift算法原理

下图展示了Mean Shift算法计算飘逸向量的过程:

AAffA0nNPuCLAAAAAElFTkSuQmCC

Mean Shift

Mean Shift算法的关键操作是通过感兴趣区域内的数据密度变化计算中心点的漂移向量,从而移动中心点进行下一次迭代,直到到达密度最大处(中心点不变)。从每个数据点出发都可以进行该操作,在这个过程,统计出现在感兴趣区域内的数据的次数。该参数将在最后作为分类的依据。

与K-Means算法不一样的是,Mean Shift算法可以自动决定类别的数目。与K-Means算法一样的是,两者都用集合内数据点的均值进行中心点的移动。

算法步骤

下面是有关Mean Shift聚类算法的步骤:在未被标记的数据点中随机选择一个点作为起始中心点center;

找出以center为中心半径为radius的区域中出现的所有数据点,认为这些点同属于一个聚类C。同时在该聚类中记录数据点出现的次数加1。

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

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

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

如果收敛时当前簇C的center与其它已经存在的簇C2中心的距离小于阈值,那么把C2和C合并,数据点出现次数也对应合并。否则,把C作为新的聚类。

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

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

算法实现

下面使用Python实现了Mean Shift算法的基本形式:import numpy as npimport matplotlib.pyplot as plt# Input data setX = np.array([

[-4, -3.5], [-3.5, -5], [-2.7, -4.5],

[-2, -4.5], [-2.9, -2.9], [-0.4, -4.5],

[-1.4, -2.5], [-1.6, -2], [-1.5, -1.3],

[-0.5, -2.1], [-0.6, -1], [0, -1.6],

[-2.8, -1], [-2.4, -0.6], [-3.5, 0],

[-0.2, 4], [0.9, 1.8], [1, 2.2],

[1.1, 2.8], [1.1, 3.4], [1, 4.5],

[1.8, 0.3], [2.2, 1.3], [2.9, 0],

[2.7, 1.2], [3, 3], [3.4, 2.8],

[3, 5], [5.4, 1.2], [6.3, 2]

])def mean_shift(data, radius=2.0):

clusters = []    for i in range(len(data)):

cluster_centroid = data[i]

cluster_frequency = np.zeros(len(data))        # Search points in circle

while True:

temp_data = []            for j in range(len(data)):

v = data[j]                # Handle points in the circles

if np.linalg.norm(v - cluster_centroid) <= radius:

temp_data.append(v)

cluster_frequency[i] += 1

# Update centroid

old_centroid = cluster_centroid

new_centroid = np.average(temp_data, axis=0)

cluster_centroid = new_centroid            # Find the mode

if np.array_equal(new_centroid, old_centroid):                break

# Combined 'same' clusters

has_same_cluster = False

for cluster in clusters:            if np.linalg.norm(cluster['centroid'] - cluster_centroid) <= radius:

has_same_cluster = True

cluster['frequency'] = cluster['frequency'] + cluster_frequency                break

if not has_same_cluster:

clusters.append({                'centroid': cluster_centroid,                'frequency': cluster_frequency

})

print('clusters (', len(clusters), '): ', clusters)

clustering(data, clusters)

show_clusters(clusters, radius)# Clustering data using frequencydef clustering(data, clusters):

t = []    for cluster in clusters:

cluster['data'] = []

t.append(cluster['frequency'])

t = np.array(t)    # Clustering

for i in range(len(data)):

column_frequency = t[:, i]

cluster_index = np.where(column_frequency == np.max(column_frequency))[0][0]

clusters[cluster_index]['data'].append(data[i])# Plot clustersdef show_clusters(clusters, radius):

colors = 10 * ['r', 'g', 'b', 'k', 'y']

plt.figure(figsize=(5, 5))

plt.xlim((-8, 8))

plt.ylim((-8, 8))

plt.scatter(X[:, 0], X[:, 1], s=20)

theta = np.linspace(0, 2 * np.pi, 800)    for i in range(len(clusters)):

cluster = clusters[i]

data = np.array(cluster['data'])

plt.scatter(data[:, 0], data[:, 1], color=colors[i], s=20)

centroid = cluster['centroid']

plt.scatter(centroid[0], centroid[1], color=colors[i], marker='x', s=30)

x, y = np.cos(theta) * radius + centroid[0], np.sin(theta) * radius + centroid[1]

plt.plot(x, y, linewidth=1, color=colors[i])

plt.show()

mean_shift(X, 2.5)

上述代码执行结果如下:

AAffA0nNPuCLAAAAAElFTkSuQmCC

执行结果

其他

Mean Shift算法还有很多内容未提及。其中有“动态计算感兴趣区域半径”、“加入核函数计算漂移向量”等。本文作为入门引导,暂时只覆盖这些内容。

作者:chardlau

链接:https://www.jianshu.com/p/3087aa859cb8


http://chatgpt.dhexx.cn/article/9U8KHcrS.shtml

相关文章

Python 实现MeanShift算法

原理 大家自行百度吧&#xff0c;我懒得码字了 推荐一下原理原理https://blog.csdn.net/jinshengtao/article/details/30258833 代码 直接上代码了&#xff0c;看不懂&#xff0c;就参照一下原理 # author: wdq # contact: 1920132572qq.com # datetime:2022/3/15 17:40 # …

Sklearn聚类算法之meanshift

以二维来说明可能更容易理解&#xff0c;下图中的很多的红点就是我们的样本特征点&#xff0c;meanshift就是在这些点中的任意一个点为圆心&#xff0c;然后以半径R画一个圆&#xff08;在opencv中是一个矩形&#xff09;&#xff0c;然后落在这个圆中的所有点和圆心都会对应的…

Python实现Mean Shift聚类算法

Mean Shift算法&#xff0c;又称均值聚类算法&#xff0c;聚类中心是通过在给定区域中的样本均值确定的&#xff0c;通过不断更新聚类中心&#xff0c;直到聚类中心不再改变为止&#xff0c;在聚类、图像平滑、分割和视频跟踪等方面有广泛的运用。 Mean Shift向量 对于给定的…

mean shift 跟踪算法

说明一&#xff1a; Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束. 1. Meanshift推导 给定d维空间Rd的n个样本点 ,i1,…,n,在空间中任选一点x&#xff0c;那么Mean Shift向量…

Python实现Mean Shift算法

声明&#xff1a;代码的运行环境为Python3。Python3与Python2在一些细节上会有所不同&#xff0c;希望广大读者注意。本博客以代码为主&#xff0c;代码中会有详细的注释。相关文章将会发布在我的个人博客专栏《Python从入门到深度学习》&#xff0c;欢迎大家关注~ 在K-Means算…

meanshift算法 java_Meanshift,聚类算法

记得刚读研究生的时候&#xff0c;学习的第一个算法就是meanshift算法&#xff0c;所以一直记忆犹新&#xff0c;今天和大家分享一下Meanshift算法&#xff0c;如有错误&#xff0c;请在线交流。 Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其…

保边滤波之Mean shift filter

Mean shift filter 目录 Mean shift filter 一、算法原理 二、练手实现的算法代码如下&#xff1a; 三、实现结果 一、算法原理 在OpenCV中&#xff0c;meanshift filter函数为 pyrMeanShiftFiltering&#xff0c; 它的函数调用格式如下&#xff1a; C: void pyrMeanShif…

mean shift

参考&#xff1a; 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…

机器学习算法原理与实践(二)、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…