Mean-Shift聚类方法

 

刘玉琪

·

跟随

出版于

台湾人工智能学院

·

一、说明

        上一篇介绍了基于密度的分群方法——DBSCAN,本篇会介绍另一个分群方法——Mean Shift,与DBSCAN一样不需要预先知道欲分群的数量,而对于分群的形状也没有限制。

        然而,这个方法是基于核密度估计(kernel Density Estimation)的演算。可以想象数据是从同一个机率分布的数据集抽取的,而KDE(Kernel Density Estimation)的方法就是去估计数据的分布情况。 Mean Shift算法在许多领域都有成功的应用,例如图像分割、物体追踪等。下面将详细介绍该方法的基本概念、演算法、以及算法实作。

二、基本概念  

        Mean Shift主要的思想是假设数据集的密度以多个合成的核函数分布,然后随核密度分布,而数据集的所有点只要沿着密度对应的方向移动,直到位于最近最大密度的位置,意即计算密度估计曲线的最大值,便能将数据分群。

  • 核密度估计(kernel Densityestimation)

利用核函数(kernel)来得出数据点x_1, x_2, … , x_n的分布来稀疏密度的分布曲线(机率分布),所以对一个数据点x来说,机率的估计可以写成

K为核函数(核函数),d为维度,h为带宽(带宽)。不同的h对核密度估计有很大的影响。太小的h会使得KDE的峰值为数据集的所有点(自成一类);手工则可以缩短一个(休闲一类)。

左图为数据集;右图为验证密度估计曲线带宽为2

左图的带宽为0.05,右图的带宽为5

三、关于核函数(kernel function)

核函数一般以零为中心点的函数,表示为

c_{k, d}是正规化参数,使得函数的积分值为1

最常见的是高斯函数,定义为

常用的核函数(kernel function)。来源:https://en.wikipedia.org/wiki/Kernel_(statistics)

Mean Shift 算法会沿着 KDE 的轻微方向寻找机率上升,因此考虑

g(s) = -k'(s),则

前一项为核函数,后一项则为均值平移向量

利用迭代的方式更新中心点:

  1. 计算当前的均值平移向量m_h(center_old)
  2. 中心点沿平均偏移量移动做为新的中心点,意即center_new = center_old +mean shift。

直至收敛以找到准确估计收敛的位置。

四、演算 

输入:资料集D,以及带宽bandwidth

输出:目标分群集合Clusters

  1. 从附带分群的数据点中选择一个起始点做为中心。

2.将距离中心点小于带宽的数据点分为同群,记为集合M。

红色点为集合M里的元素

3. 计算从中心点到集合M中每个元素的计算,并做计算平均相加得到平均偏移计算均值 平移向量。

橘色向量即为均值平移向量

4. 中心点沿线平均偏移允许移动做为新的中心点,意即center = center +mean shift。

橘色点为新的中心点(会往KDE的顶部方向移动)

5. 重复步骤2、3、4,直到中心点不再动趋势(否则找到局部极大值)。若该群的中心点已归于先前所分的群中,则将两个群合并为同一群。

6. 重复以上步骤直至所有点均已完成财务状况。

五、算法实操代码  

        使用Sklearn.cluster.MeanShift套件:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import MeanShift, estimate_bandwidth
from sklearn import datasets
#create datasets
X,y = datasets.make_blobs(n_samples=50, centers=3, n_features=2, random_state= 20, cluster_std = 1.5)
#estimate bandwidth
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=1000)
#Mean Shift method
model = MeanShift(bandwidth = bandwidth, bin_seeding = True)
model.fit(X)
labels = model.fit_predict(X)
#results visualization
plt.figure()
plt.scatter(X[:,0], X[:,1], c = labels)
plt.axis('equal')
plt.title('Prediction')
plt.show()

右图预测的结果概率会有所不同,由此估计带宽为 2.92

        用于影像分割 …

import numpy as np
import matplotlib.pyplot as plt
from skimage.transform import rescale
from sklearn.cluster import MeanShift, estimate_bandwidth
import cv2
#load image
img = cv2.imread('AIA.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = rescale(img, 0.2)
rows, cols, chs= img.shape
#convert image shape [rows, cols, 3] into [rows*cols, 3]
feature_img = np.reshape(img, [-1, 3])
#estimate bandwidth
bandwidth = estimate_bandwidth(feature_img, quantile=0.2, n_samples=1000)
#Mean Shift method
model = MeanShift(bandwidth = bandwidth, bin_seeding = True)
model.fit(feature_img)
labels = model.fit_predict(feature_img)
#results visualization
fig = plt.figure(figsize = (20, 12))
ax = fig.add_subplot(121)
ax1 = fig.add_subplot(122)    
    
ax.imshow(img)
ax1.imshow(np.reshape(labels, [rows, cols]))
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络层:控制平面

路由选择算法 路由选择算法就是为了在端到端的数据传输中,选择路径上路由器的最好的路径。通常,一条好的路径指具有最低开销的路径。最低开销路径是指源和目的地之间具有最低开销的一条路。 根据集中式还是分散式来划分 集中式路由选择算法&#xff1a…

基础Redis-Java客户端操作介绍

Java客户端操作介绍 2.基础-Redis的Java客户端a.介绍b.Jedisc.Jedis连接池d.SpringDataRedise.SpringDataRedis的序列化方式f.StringRedisTemplate 2.基础-Redis的Java客户端 a.介绍 Jedis 以Redis命令作为方法名称,学习成本低,简单实用。但是Jedis实例…

性能工作站,双十一大促,超值推荐:蝰蛇峡谷 NUC12SNKi7迷你主机,优惠抢购!

近年来,ITX主机和小型化系统变得越来越受欢迎。英特尔的NUC受到许多玩家们的关注。作为mini主机的代表NUC小巧设计和灵活性使它成为很多玩家和科技爱好者的选择。它的高性能和可玩性使得它在迷你型准系统市场上备受推崇。双11来临之际,我们分析下哪款高性…

【React】【react-globe.gl】3D Objects效果

目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果 示例地址 实现过程 踩坑 示例是通过script引入的依赖,但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaS…

前端的几种网络请求方式

网络请求 node编写接口 这里用到的几个包的作用 express:基于 Node.js 平台,快速、开放、极简的 Web 开发框架,官网:https://www.expressjs.com.cn/cors:用来解决跨域问题body-parser:可以通过 req.body…

Leetcode48旋转图像

思路:找规律 方法一、一般辅助数组解法 行列转换,第一行变到第三列,第二行变到第二列,第三行变到第一列 matrix[row][col] matrix[col][n-row-1] 然后复制回原数组 class Solution {public void rotate(int[][] matrix) {in…

Spring cloud负载均衡 @LoadBalanced注解原理

接上一篇文章,案例代码也在上一篇文章的基础上。 在上一篇文章的案例中,我们创建了作为Eureka server的Eureka注册中心服务、作为Eureka client的userservice、orderservice。 orderservice引入RestTemplate,加入了LoadBalanced注解&#x…

线性【SVM】数学原理和算法实现

一. 数学原理 SVM是一类有监督的分类算法,它的大致思想是:假设样本空间上有两类点,如下图所示,我们希望找到一个划分超平面,将这两类样本分开,我们希望这个间隔能够最大化来使得模型泛化能力最强。 如上图所…

谷歌浏览器默认https 怎么关闭

#然后把网址从 https 改成http 回车即可

用于3D Visual Grounding的多模态场景图

文章目录 引言方法1. Language Scene Graph Module Paper:《Free-form Description Guided 3D Visual Graph Network for Object Grounding in Point Cloud》【ICCV’2021】 Code:https://github.com/PNXD/FFL-3DOG 引言 3DVG任务有以下三个挑战&#x…

c语言 简单认识 指针和结构体

指针 代码 #include <stdio.h>int main(){int a 10;//指针类型需要与变量的类型相同&#xff0c;且后面需要添加一个*符号&#xff08;注意这里不是乘法运算&#xff09;表示是对于类型的指针int * p &a; //这里的&并不是进行按位与运算&#xff0c;而是取…

迅为iTOP-i.MX8M开发板使用 make 工具

make 工具是编译辅助工具&#xff0c;用来解决使用命令编译工程非常繁琐的问题。 调用这个命令工具&#xff1a;我们在 windows 上编程使用 ide &#xff0c;我们有图形界面&#xff0c;有相应的按钮&#xff0c;比如说 build 或者 run 来编译。其实 make 这个编译辅助工具使…

【Python基础】IF、Else判断以及Whlie、for循环介绍符实例

运算符 1. if 语句体验2.逻辑运算3. if 语句进阶4.While循环4.1基本语法 5.break 和 continue6. for循环 1. if 语句体验 if 判断语句基本语法 在 Python 中&#xff0c;if 语句 就是用来进行判断的&#xff0c;格式如下&#xff1a; if 要判断的条件: 条件成立时&#xff0c;…

如何使用腾讯云+Picgo搭建图床

目录 一、进入腾讯云进行实名认证 二、领取免费存储额度 2.1新用户界面概览就可以领取 三、开始创建远端图床并生成秘钥等信息 3.1创建存储桶 3.2配置基本信息 3.3配置高级选项 3.4确认配置页面点击创建即可 3.5创建访问秘钥 3.6查看秘钥等信息 3.7查看桶名称 四、图…

lv9 嵌入式开发 数据库sqlite

1 数据库基本概念 数据&#xff08;Data&#xff09; 能够输入计算机并能被计算机程序识别和处理的信息集合 数据库 &#xff08;Database&#xff09; 数据库是在数据库管理系统管理和控制之下&#xff0c;存放在存储介质上的数据集合 2 常用的数据库 大型数据库…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年&#xff0c;Paas化刚刚提出不久时&#xff0c;基于部门内第一次Paas化热部署落地经验所写&#xff0c;主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先&#xff0c;确定领域服务所属的领域 2.其次&#xff0c;确定垂直…

前端基础之BOM和DOM

1、BOM和DOM简述 BOM&#xff1a;指浏览器对象模型&#xff0c;它使JavaScript有能力与浏览器进行对话 DOM&#xff1a;指文档对象模型&#xff0c;通过它&#xff0c;可以访问HTML文档的所有元素 2、Window对象 所有浏览器都支持window对象&#xff0c;他表示浏览器窗口。 如果…

5.3 连接和分离线程

方法 pthread_join(thread, status) pthread_detach(thread) pthread_attr_setdetachstate(attr, detachstate) pthread_attr_getdetachstate(attr) 连接 连接&#xff08;joining&#xff09;是一种线程之间完成同步的方法&#xff0c;举例如下。 pthread_join()方法会阻…

无代码平台哪家好,盘点最新国内十大无代码零代码平台排名

无代码&#xff08;No Code&#xff09;是一种通过使用可视化界面和预构建的模块来创建应用程序、网站或其他数字化解决方案的方法&#xff0c;不需要编写大量的手动代码。 无代码平台通常包括一些基本的构建块&#xff0c;如表单、按钮、文本框等&#xff0c;用户可以通过拖拽…

Android Studio(对话框AlertDialog)

前言 前面介绍了常用控件的相关属性&#xff0c;那些控件的使用起来也很容易。在本节及后面的章节介绍的控件将是相比于前面使用起来较为复杂的&#xff08;不过使用多了&#xff0c;也很容易上手&#xff09;。 这些控件常常需要配合java代码来使用&#xff0c;比如说对话框、…