机器学习系列 - Mean Shift聚类

文章目录

    • 前言
    • 一、原理
      • 前置知识点
      • Mean Shift计算步骤
    • 二、应用举例-图像分割
    • 三、聚类实战-简单实例
    • bandwidth=1
    • bandwidth=2
    • 总结

前言

Mean Shift(均值漂移)是基于密度的非参数聚类算法,其算法思想是假设不同簇类的数据集符合不同的概率密度分布,找到任一样本点密度增大的最快方向(最快方向的含义就是Mean Shift),样本密度高的区域对应于该分布的最大值,这些样本点最终会在局部密度最大值收敛,且收敛到相同局部最大值的点被认为是同一簇类的成员。

Mean Shift在计算机视觉领域的应用非常广,如图像分割,聚类和视频跟踪等。

一、原理

前置知识点

  • 核密度估计: Mean-shift的核心思想是通过估计数据点分布的概率密度函数来发现数据集的聚类结构。它使用核函数(通常是高斯核函数)来对每个数据点的周围区域进行加权,得到一个局部密度估计。

对于每一个数据点 x i x_i xi,其邻域内点密度计算公式如下:
在这里插入图片描述
其中,K是高斯核函数,h是带宽参数,n是数据集的大小,d是数据点的维数

下图是一维数据集的核概率密度,其中虚线表示每个样本的核函数,实线是每个样本的核函数进行叠加,表示数据集的概率密度。该数据集的概率密度只有一个局部最大值,因此,此时mean shift算法的簇类个数是1。
在这里插入图片描述

  • 梯度上升: 在密度估计的基础上,Mean-shift算法通过对密度梯度进行上升来寻找数据点的模态或聚类中心。梯度上升的过程可看作在概率密度函数表面上向着密度增长最快的方向移动。

ps:
数据集密度函数如下:
在这里插入图片描述
对数据集密度函数求导:
在这里插入图片描述
其中, g ( s ) = − k ′ ( s ) g(s)=-k'(s) g(s)=k(s)

  • 迭代过程: 算法通过不断迭代的方式更新每个数据点的位置,直到收敛到一个局部极值点。具体而言,对于每个数据点,通过计算其周围区域内的梯度方向,将点沿梯度方向移动一定的步长。这个步长通常由算法自适应确定。

ps:
公式(2)的第一项为实数值,因此第二项的向量方向与梯度方向一致,得到均值漂移向量(均值漂移向量所指的方向是密度增加最大的方向):
在这里插入图片描述

  • 收敛条件: 迭代过程的收敛条件通常是梯度变为零或变得足够小。当梯度接近零时,说明数据点已经移动到密度估计的峰值位置,此时算法认为达到了聚类中心。

  • 聚类结果: 最终,所有数据点都会收敛到密度估计的峰值位置,形成聚类。如果多个数据点收敛到相同的峰值,它们被认为属于同一个聚类。

Mean Shift计算步骤

  • (1)计算每个样本的均值漂移向量: m h ( x i ) m_h(x_i) mh(xi)
  • (2)对每个样本进行平移: x i = x i + m h ( x i ) x_i=x_i+m_h(x_i) xi=xi+mh(xi)
  • (3)重复步骤(1)(2),直到样本点收敛,即 m h ( x i ) = 0 m_h(x_i)=0 mh(xi)=0
  • (4)收敛到相同点的样本被认为是同一簇类的成员

二、应用举例-图像分割

对下图进行图像分割
在这里插入图片描述
将数据映射到RGB三维空间:
在这里插入图片描述
运行mean shift算法,使用带宽为25的高斯核,下图展示了每个样本收敛到局部最大核密度的过程:
请添加图片描述
每个样本点最终会移动到核概率密度的峰值,移动到相同峰值的样本点属于同一种颜色,图像分割结果如下图所示:

在这里插入图片描述

三、聚类实战-简单实例

from sklearn.cluster import MeanShift
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=1.0, random_state=42)# 创建Mean Shift模型并拟合数据
bandwidth = 1  # 设置带宽,需要根据数据特点调整
bin_seeding = True  # 是否使用直方图种子来初始化均值漂移,它可以加快收敛速度,默认True
ms = MeanShift(bandwidth=bandwidth, bin_seeding=bin_seeding)
ms.fit(X)# 获取聚类结果
labels = ms.labels_
cluster_centers = ms.cluster_centers_# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1,], marker='o', s=100, color='red')
plt.show()

重要参数:bandwidth,需要根据数据特点调整,如下所示:

ps:如果带宽参数过小,会导致聚类中心过多,如果带宽参数过大,会导致聚类中心过少。因此,在实际应用中,我们需要通过交叉验证等方法来确定带宽参数的取值。

bandwidth=1

在这里插入图片描述

bandwidth=2

在这里插入图片描述

总结

优点:

  • 不需要设置簇类的个数,自动发现潜在的聚类中心,对于高维度和非线性分布的数据集也有很好的适应性
  • 可以处理任意形状的簇类
  • 参数少,算法只需设置带宽这一个参数,带宽影响数据集的核密度估计
  • 算法结果稳定,不需要进行类似K均值的样本初始化

缺点:

  • 聚类结果取决于带宽的设置,带宽设置的太小,收敛太慢,簇类个数过多;带宽设置的太大,一些簇类可能会丢失。
  • 对于较大的特征空间,计算量非常大。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open CASCADE学习|创建多段线与圆

使用Open CASCADE Technology (OCCT)库来创建和显示一些2D几何形状。 主要过程如下: 包含头文件:代码首先包含了一些必要的头文件,这些头文件提供了创建和显示几何形状所需的类和函数。 定义变量:在main函数中,定义…

Java 将TXT文本文件转换为PDF文件

与TXT文本文件,PDF文件更加专业也更适合传输,常用于正式报告、简历、合同等场合。项目中如果有使用Java将TXT文本文件转为PDF文件的需求,可以查看本文中介绍的免费实现方法。 免费Java PDF库 本文介绍的方法需要用到Free Spire.PDF for Java…

开源!免费!Hugging Face推出GPT商城

Hugging Face发布开源AI助手制造工具,与OpenAI的定制GPT形成竞争 Hugging Face今年1月31日推出一款开源AI代码库——Hugging Chat Assistants,允许用户轻松创建特定功能的定制AI聊天机器人。 不同于OpenAI的ChatGPT商城需要每月20美金成为会员才能使用…

c语言--指针数组(详解)

目录 一、什么是指针数组?二、指针数组模拟二维数组 一、什么是指针数组? 指针数组是指针还是数组? 我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。 那指针数组呢?是存放…

编译原理实验1——词法分析(python实现)

文章目录 实验目的实现定义单词对应的种别码定义输出形式:三元式python代码实现运行结果检错处理 总结 实验目的 输入一个C语言代码串,输出单词流,识别对象包含关键字、标识符、整型浮点型字符串型常数、科学计数法、操作符和标点、注释等等。…

大数据术语系列(1)——COW和MOR,我如何使用chatgpt通俗易懂地理解了hudi这两种表类型

从传统数据库到大数据的转变,首当其冲的是各种术语的理解。 所以我与chatgpt发生了一系列对话,以便于我能快速理解这些术语。 我先把汇总的结果放在前边,后边会一步步地来说明我是如何获取这些信息的。前边我也发过一些关于chatgpt提示词相…

寒假提升(5)[利用位操作符的算法题]

日子是一天天地走,书要一页页地读。 ——毕淑敏 算法 位操作符的合理使用来解决问题1、题目大概2、理解和想办法解决3、结果 位操作符的合理使用来解决问题 1、题目大概 题目要求让我们把一个数字用二进制表示出来的时候,将他的奇数位置和偶数位置交换…

HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)

在前端和nodejs的世界里,有很多开源的js库,通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API,因此三方js库大都需要适配下才能用。 移植前准备 建议在适…

如何找准用户真实需求,建立情感连接?

品牌如果想要长久发展,除了独特的理念以及过硬的产品质量外还需要一点,那就在于它能持续、正确的为用户创造生活幸福感。这满足了用户的真实需求,并与其产生了情感连接,从而让品牌有机会逐渐融入、改善用户的生活实现长期价值与口…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士,您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作,拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中,我们将介绍当今…

操作系统-信号量机制(整型信号量 记录型信号量)与用信号量实现进程互斥,同步,前驱关系

文章目录 信号量机制总览信号量机制整型信号量记录型信号量例子记录型信号量小结 小结 用信号量实现进程互斥,同步,前驱关系总览信号量机制实现进程互斥信号量机制实现进程同步进程同步信号量实现进程同步 信号量机制实现前驱关系小结 信号量机制 总览 …

freeRTOS总结(十五)软件定时

1,软件定时器的简介(了解) 定时器: 从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器的周期 硬件定时器: 芯片本身自带的定时器模块,硬件定…

使用dbeaver导入Excel到mysql数据库

最近业务需要将Excel导入到mysql数据库中,之前一直用的heisql,但是heidisql的导入功能太弱了,后来用了dbeaver,功能很强大。 一、安装dbeaver 首先去官网下载dbeaver社区版,社区版免费:dbeaver.io/ dbea…

3.2-媒资管理之MinIo分布式文件系统+上传图片

媒资管理 3 分布式文件系统 3.1 什么是分布式文件系统 要理解分布式文件系统首先了解什么是文件系统。 查阅百度百科: 文件系统是负责管理和存储文件的系统软件,操作系统通过文件系统提供的接口去存取文件,用户通过操作系统访问磁盘上的文…

JavaScript基础第三天

JavaScript 基础第三天 今天我们学习for循环、while循环、终止循环和无限循环。 1. for 循环 1.1. 语法 // 1. 语法格式 // for(起始值; 结束条件; 累加器) { // // 要重复执行的代码 // }1.2. 示例代码 let sum 0; for (let i 0; i < 100; i) {sum i; } alert(&q…

jsp康养小镇管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP康养小镇管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&a…

[超分辨率重建]ESRGAN算法训练自己的数据集过程

一、下载数据集及项目包 1. 数据集 1.1 文件夹框架的介绍&#xff0c;如下图所示&#xff1a;主要有train和val&#xff0c;分别有高清&#xff08;HR&#xff09;和低清&#xff08;LR&#xff09;的图像。 1.2 原图先通过分割尺寸的脚本先将数据集图片处理成两个相同的图像…

JavaScript中call、apply、bind方法的应用与区别

在JavaScript中&#xff0c;call、apply和bind是函数的三个重要方法&#xff0c;它们虽然功能不同&#xff0c;但都可以用来改变函数的执行上下文或者传递参数。本文将分别介绍call、apply和bind方法的应用和区别&#xff0c;并附带示例代码。 一、call方法 call方法的作用是…

Spring GateWay

概述简介 能干什么 反向代理 鉴权 流量控制 熔断 日志监控 Spring Cloud Gateway 与Zuul的区别 在SpringCloud Finchley正式版之前&#xff0c;Spring Cloud推荐的网关是 Netflix提供的Zuul: 1、Zuul 1.x&#xff0c;是一个基于阻塞Ⅳ/O的APl Gateway 2、Zuul 1.x基于Servl…

如何保持mac苹果电脑系统在最佳状态?不卡顿

苹果电脑一直以其卓越的性能和用户友好的操作系统而备受欢迎。然而电脑上的文件、应用程序和缓存可能会逐渐积累&#xff0c;导致性能下降。为了确保你的苹果电脑保持最佳状态&#xff0c;高效清理是至关重要的一步。在本文中&#xff0c;我们将分享一些如何清理苹果电脑更高效…