聚类算法(2)--Mean Shift
目录
mean shift 算法理论
基本的Mean Shift向量形式
sklearn参数
python—sklearn实例演示
PS:
Mean shift 算法是基于核密度估计的爬山算法,可用于聚类、图像分割、跟踪等,因为最近搞一个项目,涉及到这个算法的图像聚类实现,因此这里做下笔记。
mean shift 算法理论
Mean-shift(即:均值迁移)的基本思想:在数据集中选定一个点,然后以这个点为圆心,r为半径,画一个圆(二维下是圆),求出这个点到所有点的向量的平均值,而圆心与向量均值的和为新的圆心,然后迭代此过程,直到满足一点的条件结束。(Fukunage在1975年提出)
Mean-Shift是一种基于滑动窗口的聚类算法。也可以说它是一种基于质心的算法,这意思是它是通过计算滑动窗口中的均值来更新中心点的候选框,以此达到找到每个簇中心点的目的。然后在剩下的处理阶段中,对这些候选窗口进行滤波以消除近似或重复的窗口,找到最终的中心点及其对应的簇。
整体的图例如下:
分步骤演示:
步骤1:在指定的区域内计算偏移均值(如下图的黄色的圈)
步骤2:移动该点到偏移均值点处
步骤3: 重复上述的过程(计算新的偏移均值,移动)
我们再用一个比较直观的实例看一下:
基本的Mean Shift向量形式
sklearn参数
[class sklearn.cluster.MeanShift]
bandwidth=None: float,高斯核函数的半径(或带宽),如果没有给定,则使用sklearn.cluster.estimate_bandwidth 自动估计带宽;
seeds=None: array, shape=[n_samples, n_features],我理解的 seeds 是初始化的质心,如果为 None 并且 bin_seeding=True,就用 clustering.get_bin_seeds 计算得到;
bin_seeding=False: boolean,在没有设置 seeds 时起作用,如果 bin_seeding=True,就用 clustering.get_bin_seeds 计算得到质心,如果 bin_seeding=False,则设置所有点为质心;
min_bin_freq=1: int,clustering.get_bin_seeds 的参数,设置的最少质心个数;
以上三个参数要结合起来理解;
cluster_all=True: boolean,如果为 True,所有的点都会被聚类,包括不在任何核内的孤立点,其会选择一个离自己最近的核;如果为 False,孤立点的类标签为 -1;
n_jobs=1: int,多线程;
-1:使用所有的cpu;
1:不使用多线程;
-2:如果 n_jobs<0,(n_cpus + 1 + n_jobs)个cpu被使用,所以 n_jobs=-2 时,所有的cpu中只有一块不被使用;
主要属性
cluster_centers_ : 数组类型。计算出的聚类中心的坐标。
labels_ :数组类型。每个数据点的分类标签。
python—sklearn实例演示
我们运用K-means里面的一个数据样本:
import numpy as np
cluster1 = np.random.uniform(0.5, 1.5, (2, 10))
cluster2 = np.random.uniform(3.5, 4.5, (2, 10))
X = np.hstack((cluster1, cluster2)).T#合并数据
plt.figure()
plt.axis([0, 5, 0, 5])
plt.grid(True)
plt.plot(X[:,0],X[:,1],'k.')
导入相关包
from sklearn.cluster import MeanShift, estimate_bandwidth
bandwidth1 = estimate_bandwidth(X, quantile=0.2)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)
print("number of estimated clusters : %d" % n_clusters_)
number of estimated clusters : 2
import matplotlib.pyplot as plt
from itertools import cycle
plt.figure(1)
plt.clf()
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
my_members = labels == k
cluster_center = cluster_centers[k]
plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
markeredgecolor='k', markersize=14)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()
PS:
bandwidth=None: float,高斯核函数的半径(或带宽),如果没有给定,则使用sklearn.cluster.estimate_bandwidth 自动估计带宽
我们上面就是运用了sklearn.cluster.estimate_bandwidth计算了
bandwidth
对于bandwidth我们简单解释下
estimate_bandwidth
(X, quantile=0.3, n_samples=None, random_state=0, n_jobs=None)
X : array-like, shape=[n_samples, n_features]
Input points.
quantile : float, default 0.3
should be between [0, 1] 0.5 means that the median of all pairwise distances is used.
n_samples : int, optional
The number of samples to use. If not given, all samples are used.
random_state : int, RandomState instance or None (default)
The generator used to randomly select the samples from input points for bandwidth estimation. Use an int to make the randomness deterministic. See Glossary.
n_jobs : int or None, optional (default=None)
The number of parallel jobs to run for neighbors search.
None
means 1 unless in ajoblib.parallel_backend
context.-1
means using all processors. See Glossary for more details.
举个例子对quantile的影响来看一下:
import numpy as np
X0 = np.array([7, 5, 7, 3, 4, 1, 0, 2, 8, 6, 5, 3])
X1 = np.array([5, 7, 7, 3, 6, 4, 0, 2, 7, 8, 5, 7])
X00=np.array(list(zip(X0, X1))).reshape(len(X0), 2)#组合数据
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(X00[:, 0], X00[:, 1],c='b')#原始数据散点图
from sklearn.cluster import MeanShift, estimate_bandwidth
for a in list(range(2,10,1)):
b=a/10
bandwidth = estimate_bandwidth(X00, quantile=b)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(X00)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)
print("number of estimated clusters : %d" % n_clusters_)
number of estimated clusters : 5 number of estimated clusters : 5 number of estimated clusters : 3 number of estimated clusters : 2 number of estimated clusters : 2 number of estimated clusters : 1 number of estimated clusters : 1 number of estimated clusters : 1
我们可以看到随着 quantile的增大,聚类的数量随之减少。
for a in list(range(2,10,1)):
b=a/10
bandwidth = estimate_bandwidth(X00, quantile=b)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(X00)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)
plt.figure(figsize=(16, 16))
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
my_members = labels == k
cluster_center = cluster_centers[k]
plt.plot(X00[my_members, 0], X00[my_members, 1], col + '.')
plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
markeredgecolor='k', markersize=14)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()
plt.savefig('test1')
相关文章
- 破堤模式A
using System; using System.Collections.Generic; using System.Text; namespace testone { class KB { private int t, t0, Tf; private double hL;//堤坝高度(常态) public double hr;//堤坝内水高度(过…...
2023/1/31 22:19:56 - ListView与ArrayAdapter的使用
要使用酷炫的listView,必须要会用适配器。 什么是适配器呢,适配器就是将布局和数据连接起来的东西。 比如,一个ListView里面有很多行东西(Item),这些东西有可能只是一个字符串,也有可能是一个…...
2023/1/31 22:19:08 - java quartz 定时器,java 定时器 quartz的使用
spring 3.0.5 quartz 1.8刚开始用的2.2.1的quartz 因为是spring3.0.5 不支持quartz 2.2.1 。使用时需要注意版本xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://www.springframework.org/schema/beanshttp://www.springframe…...
2023/1/31 22:10:17 - java反射机制 路径_Java 反射机制详解
引言本文主要介绍Java中,有关反射机制、类的加载过程、以及控制反转方面的内容。Java 反射机制Java创建对象的方式有哪些:new、反射、反序列化、克隆class对象获取的方法有哪些:类名.class、getClass、forName、classLoader.loadClass(‘包类…...
2023/1/31 22:04:45 - updatepanel失效怎么办_UpdatePanel DataGrid 中按钮失效(只刷新本页)的解决办法...
UpdatePanel DataGrid 中按钮失效(只刷新本页)的解决办法在DataGrid的ItemDataBound中用ScriptManager注册事件响应protected void dgList_ItemDataBound(object sender, DataGridItemEventArgs e){try{switch (e.Item.ItemType){case ListItemType.AlternatingItem:case List…...
2023/1/31 22:01:31 - matlab 图像处理 新浪 应变,基于MATLAB的图像处理程序
图像变换(傅立叶变换), 图像增强, 边缘检测, 滤波, 图像压缩等.实验工具:MATLAB软件课程设计时间:2008年12月实 验 部 分1. 图像变换程序代码及说明clear allN100;fzeros(50,50); %产生一个50*50的全0数组f(15:35,23:28)1;%定义图像数组,从15行到35行,…...
2023/1/31 21:57:26 - 软件测试面试题(一)
软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运…...
2023/1/31 21:51:55 - python 工业软件开发_记一次工业软件开发经历
项目概述项目背景:工厂表面处理产线项目b司接了a司一条表面处理产线的项目,包含硬件及软件,由于现在b司做的软件难用且数据难以查找,a司不满意验收不通过,款项没有结清。所有b司找到我们,希望我们能帮他搞定这个软件系…...
2023/1/31 21:50:26 - 神经网络人口预测matlab,利用MATLAB工具模拟实现人口预测实例分析.doc
摘要:人口预测对于国民经济计划的制定和社会战略目标的决策具有重要参考价值.本文主要利用MATLAB软件对中国1974-2015年的人口总数数据进行统计分析,建立BP神经网络预测模型.把它与一元非线性回归模型进行对比,得出了BP神经网络模型更加适合于…...
2023/1/31 21:46:50 - train_test_split用法总结
sklearn.model_selection.train_test_split随机划分训练集和测试集 官网文档:http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html#sklearn.model_selection.train_test_split 一般形式: train_test_spli…...
2023/1/31 21:44:05 - 苏宁!你还挺得过去吗?(苏宁大幅裁员)
前两天才写了一篇《作为一个江苏人,我眼中的苏宁》, 说实话,我内心是有点不太相信,偌大的苏宁会走到今天这步田地。 可一件件传闻都慢慢变成了实锤! 一、苏宁大裁员 一位多年老友刚跳槽去了苏宁; 入职一…...
2023/1/31 21:43:54 - inputstream java8_Java 之 字节输入流 [InputStream]
一、字节输入流java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。共性方法:public abstract int read() : 从输入流读取数据的下一个字节。返回 0 到 255 范围内…...
2023/1/31 21:42:00 - 好的软件架构设计
什么是软件架构前言:软体设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的重要决定的作出。在很多…...
2023/1/31 21:41:23 - 用request.getParameter获取不存在的属性值时
用request.getParameter获取不存在的属性值时,如果用String接这时收到的值是字符串undefined,而不是null...
2023/1/31 21:41:10 - linux串口驱动及应用程序,Linux串口(serial、uart)驱动程序设计
一、核心数据结构串口驱动有3个核心数据结构,它们都定义在1、uart_driveruart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver)。struct uart_driver {struct module …...
2023/1/31 21:41:03 - 软考高级系统分析师考了有用处吗?
软考作为计算机软件行业唯一的专业资格认证考试,要说它没用,那肯定是武断的。软考证书不是没用,而是要看你怎么用。系统分析师考试作为软考中的一项高级资格考试,系统分析师证书还是有它的含金量的。 1、评高级职称 评职称&…...
2023/1/31 21:40:52 - 基于BP神经网络模型在matlab上实现对中国每年出生人口数量的预测
目录代码采集数据简要分析结论代码 1、matlab代码 我借鉴了BP神经网络的实现实例,这个例子数据全部都给好了 %% I.清空环境变量 clear all clc%% II.训练集/测试集的产生 %1.导入数据 x xlsread(人口.xlsx,1,A2:A72); y2 xlsread(人口.xlsx,1,C2:C72); y3 xlsread(人口…...
2023/1/31 21:38:08 - CSDN插件超级赞啊!!!!
~本特利~我是一个大学生,学软件的,自从有了这个CSDN插件吃饭也香了,肝代码也爽了,你不信?那你自己试试呗。我把链接搁下边了,还不点呀!!! 点击下载CSDN插件 主要功能 个…...
2023/1/31 21:37:16 - Java 如何模拟真正的并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了。但是,这…...
2023/1/31 21:34:09 - 复杂网络基础概念总结
前言:最近刚定下的课题,现在主要学习网络基础概念的知识,凡是学习总是得做下总结笔记才能比较清楚。也分享给大家一起学习吧,如有错误可以提出私信我或者评论。 社会网络通常显示出较强的社区效应,网络中的节点趋于形成…...
2023/1/31 21:34:07
最新文章
- 聚类算法(2)--Mean Shift
目录 mean shift 算法理论 基本的Mean Shift向量形式 sklearn参数 python—sklearn实例演示 PS: Mean shift 算法是基于核密度估计的爬山算法,可用于聚类、图像分割、跟踪等,因为最近搞一个项目,涉及到这个算法的图像聚类实现…...
2023/1/31 22:20:42 - 基于Android的家校互动系统app
需求信息: 功能需求: 1:发通知、发作业 发通知和发作业,是学校教师特有的功能,教师可以通过平台进行通知和作业的发放,每当发一条信息,该班的所有人员便可以收到来自服务器的信息推送,提醒家长打…...
2023/1/31 22:20:02 - 破堤模式A
using System; using System.Collections.Generic; using System.Text; namespace testone { class KB { private int t, t0, Tf; private double hL;//堤坝高度(常态) public double hr;//堤坝内水高度(过…...
2023/1/31 22:19:56 - ListView与ArrayAdapter的使用
要使用酷炫的listView,必须要会用适配器。 什么是适配器呢,适配器就是将布局和数据连接起来的东西。 比如,一个ListView里面有很多行东西(Item),这些东西有可能只是一个字符串,也有可能是一个…...
2023/1/31 22:19:08 - 数学建模学习笔记(14)聚类模型
聚类模型K均值聚类算法和K均值聚类算法系统聚类算法(层次聚类)DBSCAN聚类算法聚类问题概述:把样本划分为由相似的对象组成的多个类的过程。 K均值聚类算法和K均值聚类算法 K均值聚类算法流程: 指定需要划分的簇的个数K。随机选…...
2023/1/31 22:18:55 - Win11的几个实用技巧系列之不能玩植物大战僵尸、如何彻底删除360所有文件
目录 Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解决方法 Win11玩不了植物大战僵尸的解决方法 win11如何彻底删除360所有文件?win11彻底删除360所有文件方法分享 win11如何卸载360: Win11不能玩植物大战僵尸怎么办?Win11玩不了植物大战僵尸的解…...
2023/1/31 22:18:07 - 个人2台网站服务器,急急急 如何架设个人web服务器
我的共享里面有一篇,很全,本来想贴在这里给你,但超过1000字了,你到那里自己下载一下,只要一分。已经重新上传“教你如何架设个人服务器----全教程”3 教你如何架设个人服务器----全教程(内网,公网)B。Web站点。点击“W…...
2023/1/31 22:18:00 - FreeRTOS事件实验
前面章节我们学习了如何使用信号量来实现同步,但是使用信号量来同步的 话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行 同步,此时信号量就无能为力。FreeRTOS 为此提供了一个可选的解决方法,那 就是事件标志组。本…...
2023/1/31 22:17:50 - hadoop02--Apache Hadoop集群搭建与介绍
文章目录本文重点内容大纲一、Apache Hadoop入门1.1、Hadoop介绍1.2、Hadoop起源发展1.3、Hadoop特性优点二、Apache Hadoop集群搭建2.1、发行版本2.2、Hadoop集群2.3、Hadoop部署模式、集群规划2.4、Hadoop源码编译三、Hadoop具体安装部署3.1、服务器基础环境准备3.2、安装包目…...
2023/1/31 22:16:47 - [1181]linux两台服务器之间传输文件和文件夹
文章目录scp1)从服务器复制文件到本地:2)复制文件到本地并重命名:3)从服务器复制文件夹到本地:4)从本地复制文件到服务器(不包括文件夹本身):5)从本地复制文件夹到服务器…...
2023/1/31 22:16:40 - yolov5篇---yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程
yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程一、任务介绍二、实验过程2.1 使用正确版本的yolov5进行训练(平台:x86机器ubuntu22.04系统)2.2 best.pt转换为best.onnx(平台:x86机器ubuntu22.04系统)2.3 best…...
2023/1/31 22:15:41 - html简洁漂亮的个人简历,个人主页,个人简介网页版(源码)
文章目录1.设计来源1.1 主界面1.2 基本资料1.3 专业技能1.4 教育经历1.5 工作经验2.效果和源码2.1 动态效果2.2 源代码源码下载作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/128349160 html简洁漂亮的个人简历,个人主页…...
2023/1/31 22:15:26 - 性能优化系列之『服务器:如何开启和配置gzip压缩』
文章の目录一、好处二、配置方法1、Nginx 配置:2、Apache 配置:三、生效检测写在最后一、好处 对文本进行压缩(HTML/CSS/JS)而对非文本不压缩(jpg/gif/png)压缩比约50%-70% 二、配置方法 1、…...
2023/1/31 22:15:04 - Java多线程join()方法
Java多线程join()方法 一、概述 1、join():等待这个线程死亡,相当于join(0)。 2、join(int n) :最多等待n毫秒之后在处理 -2.1、join的时间 < sleep的时间,那么sleep就会停止,运行时间就是join的时间 -2.2、join的时间 > …...
2023/1/31 22:14:44 - Databend 开源周报 第 77 期
Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。 即刻体验云服务:https://app.databend.com 。 What’s New 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Features & Improvements Meta 使用 expressin::TableSch…...
2023/1/31 22:14:34 - VirtualBox下安装ubuntu虚拟机图文详细教程
1 VirtualBox安装 请参考:VirtualBoxan下载安装 2 安装前配置 1)创建新虚拟机:选择“新建”(快捷键CtrlN),然后在弹出框如图所示,设置虚拟机名称,虚拟机存放文件夹、类型、版本信息,然后点击…...
2023/1/31 22:14:16 - springboot3:web开发
一.web开发 1.springboot底层为springmvc的自动配置 视图解析器静态资源(以前配置默认servlet处理)自动注册(格式化数据)静态页支持(指定位置自动发现)网站小图标自动显示… 2.静态资源访问 ①具体使用…...
2023/1/31 22:14:12 - LInkedList的模拟实现
在之前的文章笔者介绍了链表的实现:无头单向非循环链表的实现!感兴趣的各位老铁可以点进来看看:https://blog.csdn.net/weixin_64308540/article/details/128397961?spm1001.2014.3001.5502对于此篇博客,在一写出来,便…...
2023/1/31 22:14:11 - 第一章 spring框架概述
1.Spring框架概述*Spring是轻量级的开源的JavaEE框架*可以解决企业应用开发的复杂性*有两个核心的部分:IOC、AOPIOC:控制反转,把创建对象的过程交给Spring进行管理AOP:面向切面,不修改源代码的情况下进行功能的增加*Sp…...
2023/1/31 22:14:04 - 数据库系统原理及mysql应用教程_数据库系统原理及MySQL应用教程
第1章数据库系统概述1.1数据库系统概念1.1.1数据库1.1.2数据库管理系统1.1.3数据库管理员1.1.4应用系统1.1.5用户1.2数据库系统特点1.3数据库系统结构1.3.1三级模式内部结构1.3.2B/S与C/S应用结构1.4知识点小结1.5习题第2章信息与数据模型2.1信息的三种世界及描述2.1.1信息的现…...
2023/1/31 22:13:59