MeanShift算法原理及其python自定义实现

Mean Shift 算法原理及 Python 实现 一、Mean Shift 算法 K-Means 算法最终的聚类效果受初始的聚类中心的影响,K-Means++ 算法未选择较好的初始聚类中心提供了依据,但在 K-Means 算法中,聚类的类别个数 k 仍需要事先指定。对于类别个数未知的, K-Means 算法和 K-Means++ 算法很难将其进行精确求解。Mean Shift 算法被提出用于解决聚类个数未知的情况。 Mean Shi... 阅读详情

MeanShift算法原理

Meanshift是聚类中的一种经典方法,思想简单,用途广泛
在这里插入图片描述Meanshift基于这样的事实,一个类的中心处 点的空间密度 是最大的,因此给定一个点,只要沿着密度方向,由稀疏指向稠密就可以找到这个点所在类的中心点。

Meanshift的核心思想是: 给定一个数据点,在其周围一定的Region of interest内,计算这个Region的质心,由原来的点指向这个计算出来的质心的向量被称为Mean Shift vector,如下图中黄色向量表示的那样。
在这里插入图片描述接下来,将原来Region中心点的坐标置为质心的坐标(这个坐标是计算出来的,并不一定恰好落在原来的数据点上),在以质心坐标为中心的Region中继续计算新的质心
在这里插入图片描述直到Mean Shift vector的大小小于设定阈值的时候停止迭代
在这里插入图片描述
每一轮迭代中都对每一个点进行上面的操作,等到所有的点都收敛于有限的几个中心时,算法结束。
该算法具有很快的收敛速度。
数学推导参考:http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html
代码实现还可参考:https://blog.youkuaiyun.com/jinshengtao/article/details/30258833

MeanShift python实现

实现思路:

  1. 构建距离度量函数
  2. 构建Gaussian概率密度函数,以实现局部Region操作
  3. 构建MeanShift类
    (1) 点移动函数:对输入的一个点,计算在其Gaussian局部范围的点的影响下质心移动的新位置
    (2) 聚类号分配函数:对所有点移动后的结果进行归类
    (3) 入口函数:一些循环控制等

Tips:显然每个点的第一次移动对这个点的类的确定是至关重要的,尤其是那些在类边缘处类别定义比较模糊的位置的点。因为马太效应,在以后的移动中,这个点被质心吸引的力会更大

代码:

'''
#Implement mean-shift algorithm only using basic python
#Author:Leo Ma
#For csmath2019 assignment3,ZheJiang University
#Date:2019.04.23
'''
import numpy as np
import random
DISTANCE_THRESHOLD = 1e-4
CLUSTER_THRESHOLD = 1e-1

#define distance metric
def distance(a,b):
    return np.linalg.norm(np.array(a)-np.array(b))


#distance=(x-u)**2
def Gaussian_kernal(distance,sigma):
    return (1/(sigma*np.sqrt(2*np.pi)))*np.exp(-0.5*distance/(sigma**2))


#MeanShift类
class MeanShift(object):
    def __init__(self,kernal = Gaussian_kernal):
        self.kernal = kernal
        
    ##计算center_point点移动后的坐标
    def shift_points(self,center_point,whole_points,Gaussian_sigma):
        shifting_px = 0.0
        shifting_py = 0.0
        sum_weight = 0.0
        for each_point in whole_points:#遍历每一个点
            dis = distance(center_point,each_point)#计算当前点与中心点的距离
            Gaussian_weight = self.kernal(dis,Gaussian_sigma)#计算当前点距离中心点的高斯权重
            #所有向量相加
            shifting_px += Gaussian_weight * each_point[0]
            shifting_py += Gaussian_weight * each_point[1]
            sum_weight += Gaussian_weight
        #归一化
        shifting_px /= sum_weight
        shifting_py /= sum_weight
        return [shifting_px,shifting_py]
    
    #根据shift之后的点坐标shifting_points获得聚类id
    def cluster_points(self,shifting_points):
        clusterID_points = []#用于存放每一个点的类别号
        cluster_id=0#聚类号初始化为0
        cluster_centers = []#聚类中心点
        for i,each_point in enumerate(shifting_points):#遍历处理每一个点
            if i==0:#如果是处理的第一个点
                clusterID_points.append(cluster_id)#将这个点归为初始化的聚类号(0)
                cluster_centers.append(each_point)#将这个点看作聚类中心点
                cluster_id+=1#聚类号加1
            else:#处理的不是第一个点的情况
                for each_center in cluster_centers:#遍历每一个聚类中心点
                    dis = distance(each_center,each_point)#计算当前点与该聚类中心点的距离
                    if dis < CLUSTER_THRESHOLD:#如果距离小于聚类阈值
                        clusterID_points.append(cluster_centers.index(each_center))#就将当前处理的点归为当前中心点同类(聚类号赋值)
                if(len(clusterID_points)<i+1):#如果上面那个for,所有的聚类中心点都没能收纳一个点,说明是时候开拓一个新类了
                    clusterID_points.append(cluster_id)#把当前点置为一个新类,因为此时的cluster_idx以前谁都没用过
                    cluster_centers.append(each_point)#将这个点作为这个这个新聚类的中心点
                    cluster_id+=1#聚类号加1以备后用
        return clusterID_points
        
    #whole_points:输入的所有点
    #Gaussian_sigma:Gaussian核的sigma
    def fit(self,whole_points,Gaussian_sigma):
        shifting_points = np.array(whole_points)
        need_shifting_flag = [True] * np.shape(whole_points)[0]#每一个点初始都标记为需要shifting
        while True:
            distance_max = 0.0
            #每一轮迭代都对每一个点进行处理
            for i in range(0,np.shape(whole_points)[0]):
                if not need_shifting_flag[i]:#如果这个点已经被标记为不需要继续shifting,就continue
                    continue
                shifting_point_init = shifting_points[i].copy()#将初始的第i个点的坐标备份一下
                #shifting_points[i]由第i个点的坐标更新为第i个点移动后的坐标
                shifting_points[i] = self.shift_points(shifting_points[i],whole_points,Gaussian_sigma)
                #计算第i个点移动的距离
                dis = distance(shifting_point_init,shifting_points[i])
                #如果该点移动的距离小于停止阈值,标记need_shifting_flag[i]为False,下一轮迭代对该点不做处理
                need_shifting_flag[i] = dis > DISTANCE_THRESHOLD
                #本轮迭代中最大的距离存储到distance_max中
                distance_max = max(distance_max,dis)
            #如果在一轮迭代中,所有点移动的最大距离都小于停止阈值,就停止迭代
            if(distance_max < DISTANCE_THRESHOLD):
                break
        #根据shift之后的点坐标shift_points获得聚类id
        cluster_class_id = self.cluster_points(shifting_points.tolist())
        return shifting_points,cluster_class_id
        
from sklearn.datasets.samples_generator import make_blobs
import matplotlib.pyplot as plt 


#按照均匀分布随机产生n个颜色,每个颜色都由R、G、B三个分量表示
def colors(n):
  ret = []
  for i in range(n):
    ret.append((random.uniform(0, 1), random.uniform(0, 1), random.uniform(0, 1)))
  return ret

def main():
    centers = [[0, 1], [-1, 2], [1, 2], [-2.5, 2.5], [2.5,2.5], [-4,1], [4,1], [-3,-1], [3,-1], [-2,-3], [2,-3], [0,-4]]#设置一些中心点
    X, _ = make_blobs(n_samples=300, centers=centers, cluster_std=0.3)#产生以这些中心点为中心,一定标准差的n个samples

    mean_shifter = MeanShift()
    shifted_points, mean_shift_result = mean_shifter.fit(X, Gaussian_sigma=0.3)#Gaussian核设置为0.5,对X进行mean_shift

    np.set_printoptions(precision=3)
    print('input: {}'.format(X))
    print('assined clusters: {}'.format(mean_shift_result))
    color = colors(np.unique(mean_shift_result).size)

    for i in range(len(mean_shift_result)):
        plt.scatter(X[i, 0], X[i, 1], color = color[mean_shift_result[i]])
        plt.scatter(shifted_points[i,0],shifted_points[i,1], color = 'r')
    plt.xlabel("2018.06.13")
    plt.savefig("result_meanshift.png")
    plt.show()

if __name__ == '__main__':
    main()
       

运行结果:

在这里插入图片描述

sklearn聚类算法之Meanshift 基本思想 Meanshift是一个简单的概念,但不太好解释,用类比的方法解释或许比较容易理解。想象有一个雾气弥漫的足球场(即一个二维的特征空间),上面站着100个人(即我们的观察值)。因为雾很大,人只能看到很近的地方。每分钟每个人向四周看一看,然后朝着可以看到最多人的方向移动一步。随着时间流逝,因为人们一次次地朝着越来越大的人群移动,球场上的人开始聚集成一个小组,最终这些人就在球场上形成了聚类(cluster)。每个人的分类被指定为他们最终所在的分类。Meanshift算法步骤如下: 首先以随机选取的点为 阅读详情

相关推荐

MeanShift聚类分割算法

MeanShift算法的核心思想是通过在高维空间中计算密度梯度并进行移动,找到数据点的密度峰值,从而实现聚类。下面详细介绍该算法的数学原理和每一步的推理公式。如果所有数据点的位置变化都小于阈值 ϵ,则认为已经收敛,算法停止。如果没有达到收敛条件,则增加迭代计数器 t=t+1,并返回步骤4继续迭代。MeanShift算法迭代进行,直到数据点的位置变化小于某个阈值 ϵ 或达到最大迭代次数。这个公式表示在当前窗口内,计算所有数据点的加权平均值,其中权重由核函数决定。:检查所有数据点的位置是否都已经收敛;

twnkie的博客 932

【机器学习算法】: MeanShift算法

之所以把这个算法单独拿出来讲解,是因为这个算法比较有用,很多算法搭配这个算法,实现起来效果会更好,但是这个算法放到哪个章节都显得很突兀,因为这个算法其实是一个机器学习中的聚类算法,所以应该把这个算法和其他几种聚类算法比如kmeans、DBSCAN、层次聚类算法Birch等放在一起写,但是由于精力有限,先单独成一章把这个算法说清楚吧,而且这个算法的亮点就是用在图像处理领域。其他几种聚类算法以后有机会再写机器学习算法时再写吧。

因为热爱所以坚持 2559

【python opencv】meanshift的原理及其实现

MeanShift算法是一种基于迭代的无监督学习算法,常用于图像处理中的目标跟踪、聚类分析、密度估计等任务。它的主要思想是通过逐步移动一个窗口,寻找数据集中密度最大的区域。在图像处理中,MeanShift常被用于目标跟踪,它通过在每一帧图像中根据颜色分布和位置更新目标的位置。MeanShift算法是一种非常强大的非参数估计方法,广泛应用于图像目标跟踪、聚类分析、密度估计等领域。它通过逐步更新窗口位置来寻找数据中的高密度区域,具有较强的稳定性和适应性。

m0_62599305的博客 546

深入剖析Mean Shift聚类算法原理

转自:http://www.360doc.com/content/19/0623/22/99071_844418459.shtml Mean Shift(均值漂移)是基于密度的非参数聚类算法,其算法思想是假设不同簇类的数据集符合不同的概率密度分布,找到任一样本点密度增大的最快方向(最快方向的含义就是Mean Shift),样本密度高的区域对应于该分布的最大值,这些样本点最终会在局部密度最大值收敛...

houxiaogang05 2481

【python opencv】camshift算法原理及其实现

CamShift(Continuously Adaptive Mean Shift)是对传统MeanShift算法的改进,主要用于目标跟踪。与MeanShift不同,CamShift不仅可以跟踪目标的位置,还可以自适应地调整目标窗口的大小,使得跟踪算法能更好地适应目标的尺度变化。它广泛应用于实时视频处理中的目标检测与追踪,特别是在目标大小、形状发生变化的场景中,比传统的MeanShift更加灵活和高效。

m0_62599305的博客 1246

基于Python和OpenCV的Meanshift物体跟踪实现

物体跟踪作为计算机视觉和模式识别领域中的一个重要研究方向,其任务是自动检测和跟踪视频中感兴趣的目标,如人物、车辆或特定物体。随着技术的发展,物体跟踪已广泛应用于安防监控、人机交互、无人驾驶、智能视频分析等领域。跟踪的算法与技术也在不断创新,如卡尔曼滤波、光流法、特征匹配、深度学习等,其中Meanshift算法作为非参数密度估计的一种方法,因其实现简单、效果显著在很多场景中得到了广泛的应用。接下来,我们将深入探讨Meanshift算法的理论基础、实现细节以及在实际项目中的应用和优化策略。

weixin_42605397的博客 1257

基于MeanShift的目标跟踪算法及实现(自编函数利用Python实现)

本文简单介绍了meanshift目标追踪原理,并附有用python实现的代码

weijieming2的博客 8448

Mean-Shift原理概述

Mean-Shift原理概述,挺详细的 Mean Shift 这个概念最早是由 Fukunaga 等人[1]于 1975 年在一篇关于概率密度梯度函 数的估计中提出来的,其最初含义正如其名,就是偏移的均值向量,在这里 Mean Shift是一个名 词,它指代的是一个向量,但随着 Mean Shift 理论的发展,Mean Shift 的含义也发生了变化,如果 我们说 Mean Shift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其 偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束.

MeanShift- 案例实现(python)

MeanShiftMean Shift聚类算法背景介绍效果展示模型概览模型定义训练过程数据集数据集介绍 Mean Shift聚类算法 Mean Shift算法是一种无参密度估计算法,Mean Shift算法在很多领域都有成功应用,例如图像平滑、图像分割、物体跟踪等,这些属于人工智能里面模式识别或计算机视觉的部分,另外也包括常规的聚类应用。 背景介绍 通过名字就可以看到该算法的核心,mean(均值),shift(偏移),Mean Shift算法所做的工作是找到数据概率密度最大的区域。以二维来说明可能更容易理解

weixin_41744192的博客 3579

Mean-shift算法 C++

Mean-shift算法 C++

coze+飞书多维表格,批量分析小红书笔记,关键还能获取图片(附保姆级教程)

通过coze工作流,一键同步小红书账号和笔记链接到飞书多维表格,效率飞升~

qq_24403067的博客 4176

【52】均值漂移(MeanShift)算法原理解析与代码实现

本文系统解析均值漂移(MeanShift)算法,从“沿密度上升寻聚类”的核心逻辑切入,推导基础运算公式与核函数改进版,结合聚类、图像分割等典型应用,拆解完整运算步骤,帮助理解其原理与实践价值。均值漂移是一种直观且强大的密度聚类算法,从“漂移找密度极点”的核心逻辑出发,通过公式推导与核函数改进,解决了等权值的缺陷,广泛应用于聚类、图像分割、目标跟踪等领域。理解其原理与步骤,能更好地将其应用于实际问题中。

Try_再努力一点 1493

【低空经济】低空无人驾驶航空器运行管理系统设计方案

低空无人驾驶航空器运行管理系统(以下简称“系统”)旨在为低空域内的无人驾驶航空器(UAV)提供高效、安全、智能的运行管理服务。系统通过集成先进的通信、导航、监控、数据处理和人工智能技术,实现对低空域内无人驾驶航空器的实时监控、动态调度、风险评估和应急响应,确保其在复杂空域环境中的安全运行。系统的核心功能包括空域管理、飞行计划审批、实时监控、冲突预警、应急管理和数据分析。空域管理模块负责划分和管理低空域资源,确保不同飞行任务之间的空域隔离和高效利用。

2502_92579126的博客 1141

OpenCV-Python——第32章:Meanshift 和 Camshift目标跟踪算法

翻译自:https://docs.opencv.org/master/db/df8/tutorial_py_meanshift.html 目录 1Meanshift 1.1 原理 1.2 OpenCV中的Meashift 2CAMSHIFT 2.1 原理 2.2 OpenCV 中的 Camshift 1Meanshift 1.1 原理 Meanshift 算法的基本原理是...

YukinoAI的博客 3981

大话西游2单机版V8一键架设教程:5分钟搞定GM权限和仙玉修改(附完整物品代码表)

本文详细讲解了大话西游2单机版V8的一键架设教程,包括5分钟快速配置GM权限、仙玉修改及物品代码使用技巧。通过分步指导和服务端配置详解,帮助玩家轻松掌握游戏管理功能,重温经典回合制体验。附完整物品代码表,助你快速获取稀有道具和神兽。

weixin_42557830的博客 1236

用VASPKIT+Quantum Espresso高效绘制能带图:从K点路径生成到可视化全流程

本文详细介绍了如何整合VASPKIT与Quantum Espresso(QE)软件,构建一套高效的能带计算与可视化工作流。通过VASPKIT自动化生成高对称K点路径,结合QE完成自洽与非自洽计算,并利用gnuplot绘制发表级能带图。该流程极大提升了材料电子结构研究的效率与可重复性,是进行DFT能带计算的实用指南。

weixin_29294975的博客 164

聚类——MeanShift算法以及Python实现

均值漂移算法(MeanShift)是一种旨在发现团blobs)的聚类算法 核心思想 寻找核密度极值点并作为簇的质心,然后根据最近邻原则将样本点赋予质心 算法简介 核密度估计 根据样本分布估计在样本空间的每一点的密度。估计某点的密度时,核密度估计方法会考虑该点邻近区域的样本点的影响,邻近区域大小由带宽h决定,该参数对最终密度估计的影响非常大。通常采用高斯核:N(x)=12π−−√h...

slx_share的博客 6920

VINS-Mono 代码详细解读——IMU预积分的残差、Jacobian和协方差 processIMU()+intergrationBase类+imu_factor.h

IMU离散中值预积分 1.1、IMU模型 测量值:加速度计a^、陀螺仪w^, 加上了bias游走和随机白噪声。 真实值:加速度计a、陀螺仪w。 实际情况下,可以获得测量值a^和w^,需要反推真实值。一般忽略随机游走高斯噪声n w=w^-bg; a=qwb(a^-ba)-gw; 1.2、连续时间IMU运动模型,积分 PVQ(两帧之间) 将第k帧和第k+1帧所有的IMU进行积...

try_again_later的博客 9267

机器学习-*-MeanShift聚类算法及代码实现

MeanShift 该算法也叫做均值漂移,在目标追踪中应用广泛。本身其实是一种基于密度的聚类算法。 主要思路是:基于某一点的周围半径R内的点向量,计算出该点下一步移动的路线。当该点不再移动时,计算其与历史类簇的距离,满足阈值要求的即合并,不满足则自身形成一个类簇。 本身有改进的核方法,这里不阐述了。后续会加上 有时间补充概念,先上代码及实验结果: Python代码 #!/usr/bin/pytho...

Gradient Fly 3080

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

文章目录准备一、使用代码生成器1.数据库2.导入表并生成代码二、导入代码文件1.新建一个模块2.导入zip代码文件3.模块环境配置添加菜单和访问地址总结 准备 前提要把系统启动起来,部分教程可以参考这边文章若依框架RuoYi前后端分离项目导入IDEA及运行启动 但是完全参考这篇文章还是不能把项目启动起来,因为这篇文章没有说明数据库。 我是用的是本地数据库,采用xampp+Navicat的组合来部署和访问数据库。打开Navicat,连接并创建数据库ry-vue并导入数据脚本ry_20191008.sql,q

dream_coke的博客 1万+

龙头复盘神器/复盘于导出工具最新版5.6

龙头复盘神器,复盘于导出工具

初入python踩过的坑 8254

小瓜讲机器学习——聚类算法(二)Mean Shift算法原理及Python代码实现

2. Mean Shift算法原理 2.1 核函数估计 2.2 Mean Shift向量 2.3 Mean Shift算法原理(由概率密度函数导出) 对于某一ddd维聚类问题,其实存在对应ddd维特征空间上概率密度函数f(X=(x1,...,xd))f(X=(x_1,...,x_d))f(X=(x1​,...,xd​)),mmm个训练样本就是ddd维特征空间内的采样点。那么概率密度函数的核函数估计...

u012915522的博客 2325

大语言模型原理与工程实践:手把手教你训练 7B 大语言模型 自动化训练框架

近年来,大语言模型(Large Language Models,LLMs)在自然语言处理领域取得了突破性进展。从GPT-3到ChatGPT,再到最新的GPT-4,这些模型展现出了惊人的语言理解和生成能力,引发了学术界和产业界的广泛关注。然而,训练如此庞大的模型不仅需要海量的数据和计算资源,还需要复杂的工程实践和优化技巧。本文将深入探讨大语言模型的原理,并以7B参数规模的模型为例,详细介绍如何构建一个自动化训练框架,使读者能够亲自动手训练自己的大语言模型。

AI天才研究院 1924

python+OpenCV笔记(二十六):视频追踪(meanshift、Camshift)

python+OpenCV笔记(二十六):视频追踪(meanshift、Camshift)

ReadyGo!!!的博客 6312

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Python】sklearn机器学习之Meanshift聚类算法

凡聚类者,必有中心。按照这个思路,如果某个区域满足聚类的要求,那么其自然中心与样本均值应该是几乎重合的,这也是MeanShift算法的基本逻辑。

微小冷的学习笔记 2280

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

opencv-Python 目标跟踪(一)《Meanshift算法、Camshift算法》

Meanshift算法 meanShift,均值漂移,在聚类、图像平滑、分割、跟踪等方面有着广泛的应用,其最初的含义正如其名:偏移的均值向量;但随着理论的发展,meanShift的含义已经发生了很多变化。如今,我们说的meanShift算法,一般是指一个迭代的步骤,即先算出当前点的偏移均值,然后以此为新的起始点,继续移动,直到满足一定的结束条件。 Meanshift算法原理: 假设你有一堆点集,例如直方图反向投影得到的点集。还有一个小的窗口,这个窗口可能是圆形的...

RayChiu757374816的博客 2150

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: PCA(主成分分析)降维原理及其在optdigits以及点云数据集上的python实现
下一篇: LM(Levenberg–Marquardt)算法原理及其python自定义实现
Leo-Ma
博客等级 码龄11年 1701粉丝 124原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值