dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)

# 密度聚类DBSCAN、HDBSCAN

DBSCAN

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。 在DBSCAN算法中将数据点分为三类:

  • 核心点(Core point)。若样本 的 邻域内至少包含了MinPts个样本,即 ( )≥ ,则称样本点 为核心点。
  • 边界点(Border point)。若样本 的 邻域内包含的样本数目小于MinPts,但是它在其他核心点的邻域内,则称样本点 为边界点。
  • 噪音点(Noise)。既不是核心点也不是边界点的点

bb52e358f82776d1764f9c910f01a849.png

1、算法的流程

  • 根据给定的邻域参数Eps和MinPts确定所有的核心对象
  • 对每一个核心对象
  • 选择一个未处理过的核心对象,找到由其密度可达的的样本生成聚类“簇”
  • 重复以上过程

伪代码:

(1) 首先将数据集D中的所有对象标记为未处理状态  (2) for(数据集D中每个对象p) do  (3)    if (p已经归入某个簇或标记为噪声) then  (4)         continue;  (5)    else  (6)         检查对象p的Eps邻域 NEps(p) ;  (7)         if (NEps(p)包含的对象数小于MinPts) then  (8)                  标记对象p为边界点或噪声点;  (9)         else  (10)                 标记对象p为核心点,并建立新簇C, 并将p邻域内所有点加入C  (11)                 for (NEps(p)中所有尚未被处理的对象q) do  (12)                       检查其Eps邻域NEps(q),若NEps(q)包含至少MinPts个对象,则将NEps(q)中未归入任何一个簇的对象加入C;  (13)                 end for  (14)        end if  (15)    end if  (16) end for

2、优点

  • 相比K-Means,DBSCAN 不需要预先声明聚类数量。
  • 可以对任意形状的稠密数据集进行聚类,相对的,K-Means之类的聚类算法一般只适用于凸数据集。
  • 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
  • 聚类结果没有偏倚,相对的,K-Means之类的聚类算法初始值对聚类结果有很大影响。

3、缺点

  • 当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差,因为这种情况下参数MinPts和Eps选取困难。
  • 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的KD树或者球树进行规模限制来改进。
  • 在两个聚类交界边缘的点会视乎它在数据库的次序决定加入哪个聚类,幸运地,这种情况并不常见,而且对整体的聚类结果影响不大(DBSCAN*变种算法,把交界点视为噪音,达到完全决定性的结果。)
  • 调参相对于传统的K-Means之类的聚类算法稍复杂,主要需要对距离阈值eps,邻域样本数阈值MinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。

HDBSCAN聚类

1、空间变换

d2cb1461f6f32973a31de78fbbff78b6.png

所谓的空间变换,就是我们用互达距离来表示两个样本点之间的距离。这样会使得,密集区域的样本距离不受影响,而稀疏区域的样本点与其他样本点的距离被放大。这增加了聚类算法对散点的鲁棒性。空间变换的效果显然取决于K的选择,当K较大时,会使得核心距离变大,所以互达距离也变大,这样会有更多样本点被分配到稀疏区域。即更多点将被视为散点。

2、建立最小生成树

我们可将数据看作一个加权图,其中数据点为顶点,任意两点之间的边的权重为这些点之间的互达距离。对图像进行分裂。最终图的变化过程是:从完全图到极小连通子图。HDBSCAN使用最小生成树算法:

83e5428ef3c7d8fdcc0af1c7a1fa60cd.png

3、层次聚类结构

  • 第一步:将树中的所有边按照距离递增排序
  • 第二步:然后依次选取每条边,将边的链接的两个子图进行合并。

这样就构建出了聚合树:

aedff16369d5740f81c08e593fbad787.png

可以理解,类似于哈夫曼树的构造,这棵树自上而下数据之间的距离是从大到小的。

4、剪枝

同时进行剪枝,即最小子树做了限制,主要是为了控制生成的类簇不要过小:

  • 第一步:确定最小族大小n
  • 第二步:自上而下遍历聚类树,并在每个节点分裂时:看分裂产生的两个样本子集的样本数是否大于n
  • 如果左右儿子中有一个子结点的样本数< n,我们就直间将该节点删除,并且另一个子节点保留父节点的身份
  • 如果两个子结点中的样本数都<n,那么就将其两个子节点都删除,即当前节点不再向下分裂
  • 如果两个子结点中的样本数都>=n,那么我们进行正常分裂,即保持原聚类树不变。

5、提取簇

经过聚类树的压缩操作,树中已经没有了散点,我现在的任务只是将比较相近的节点合并到一族中去,我们最后选择的簇能够有更好的稳定性。

fd2d44b6751798870b0bb91e2dd51d23.png

我们可以这里理解,有一个阈值distance,如上图的红线。用它切割,面最近的节点作为聚类的一个类,而红线上面的聚起来的都是散点。问题是,我们如何知道阈值在哪里?能不能有更好的提取族的方式呢?HDBSCAN定义了一种基于稳定度的提取族方式那么如何来定义树中节点的稳定度呢? 我们先定义一个λ,它是距离的倒数:

5195153a00ef2e360dd013556b57596d.png

对于树中的某个节点定义两个量:λbirth,λdeath λbirth表示:分裂产生当前节点时,distance的倒数。 λdeath表示:当前节点被分裂成两个子结点时,distance的倒数。 λp表示:当前节点(族)下各节点p从前节点(族)分离出去时,distance的倒数。 在这里对λp做下说明,p从聚类族分离出去有两种情况:

  • λp = λdeath时,即该节点(簇)被分裂成两个子结点了
  • λbirth <= λp < λdeath时,即在该之间距离变化中可能切割出散点。此时,原来的节点(簇)并没有分裂成两个子结点,而是直接把散点给移除了。

我们定义稳定度为:

04bd516d961175ccdb863041b2aac682.png

提取簇步骤:

  • 第一步:初始化族

将压缩聚类树的每个叶节点都选定为某个簇。

  • 第二步:自下而上遍历遍历整棵树,并且每一步进行下面操作:

如果当前节点的稳定性小于两个子结点的稳定性总和,那么我们将该节点的稳定性设置为其子节点的稳定性之和。如果当前节点的稳定性大于两个子结点的稳定性总和,那么将当前节点定为某个簇。

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

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

相关文章

Spark IDEA 编程环境配置

文章目录1. 下载资料准备2. 建立项目、添加环境设置3. 第一个 Spark 程序学自&#xff1a;Spark机器学习实战 https://book.douban.com/subject/35280412/ 记录一下踩过的坑&#xff1a; 环境&#xff1a;win 10 java 1.8.0_281 Scala 2.11.11 Hadoop 2.7.7 Spark2.4.7 …

Makefile 基本知识

Technorati 标签: Makefile 基本知识最常见的书写方式&#xff1a; CC gcc LD ld STRIP strip CFLAGS : -Os -static -DEZ_OS_LINUX CLFLAGS : -Os -static all: mainEXEC main OBJS main.o mytool1.o mytool2.o INCS mytool1.h mytool2.ha…

python考试题库程序改错_求助,程序改错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 最近在学习python&#xff0c;其中遇到一道习题是改错的。 原代码如下 def break_words(stuff): """This function will break up words for us.""" words stuff.split( ) return words def sort_…

redis 查看key的有效期_redis中key设置过期时间

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":9,"count":9}]},"card":[{"des":"兼容Redis协议标准的、提供持久化的内存数据…

天池 在线编程 订单分配(回溯)

文章目录1. 题目2. 解题1. 题目 描述 打车派单场景, 假定有N个订单&#xff0c;待分配给N个司机。 每个订单在匹配司机前&#xff0c;会对候选司机进行打分&#xff0c;打分的结果保存在N*N的矩阵score&#xff0c;其中score[i][j]代表订单 i 派给司机 j 的分值。 假定每个订单…

2015年北京户口全攻略

最新统计数据指出 截至2013年底&#xff0c;北京市常住人口为2114.8万人&#xff0c;其中常住外来人口为802.7万人。和“北京户口”捆绑的字眼&#xff0c;历来是身份、福利&#xff0c;以至于幸福感、安全感。那么北京户口有什么好处&#xff1f;外来人口如何落户北京呢&#…

水晶报表 jar包版本过低_工具类学习-UReport报表设计器整合

dada-report报表整合UReport报表设计器工具结合日常工作和学习实践&#xff0c;针对传统报表子站面临的问题&#xff0c;尝试借助UReport报表设计器解决1.可在现有工程基础上引入Ureport2报表设计器Ureport报表设计器是一个基于WEB的在线报表设计器&#xff0c;其具有良好的界面…

LeetCode 1844. 将所有数字用字符替换

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 s &#xff0c;它的 偶数 下标处为小写英文字母&#xff0c;奇数 下标处为数字。 定义一个函数 shift(c, x) &#xff0c;其中 c 是一个字符且 x 是一个数字&#xff0c;函数返回字母表中 c 后面第 x 个字符。 …

ffmpeg编译gb28181_国标GB28181对接视频流

今天抽空写下以GB28181的方式获取摄像机视频流以备后用&#xff0c;同时也希望能帮助到正着手开发GB28181对接视频的同学&#xff0c;这块的资料实在不多。今天讲的内容不涉及到平台对接&#xff0c;平台对接下次有时间再讲&#xff0c;平台对接相对更麻烦点。通过GB28181获取摄…

表格布局等

1.设置黑色细边框技巧 表格的边框0;间距1;背景黑色; 单元格 背景 白色 2.特殊字符使用软键盘 3.使用图像占位符暂时代替未制作好的图片 4.小的背景.gif 平铺变成大的长条,占用资源少 5.当设置一个单元格的高度小于一定值时,无效;因为默认里面有一个空格字符,需要在代码里将空格…

LeetCode 1845. 座位预约管理系统(set)

文章目录1. 题目2. 解题1. 题目 请你设计一个管理 n 个座位预约的系统&#xff0c;座位编号从 1 到 n 。 请你实现 SeatManager 类&#xff1a; SeatManager(int n) 初始化一个 SeatManager 对象&#xff0c;它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。in…

unity game和scene效果不一样_不同的真石漆装饰效果也是不一样的

外墙真石漆真的是一件很好的产品&#xff0c;具有防火性、防水性、安全且环保、粘力强、永不褪色等特点&#xff0c;无疑是人们较好的选择&#xff0c;在很早之前就已经逐渐的取代了瓷砖和其他石材在人们心中的位置。真石漆的品种不止一种&#xff0c;按照装饰效果我们可以分为…

噪声产生原因_空调噪声大?啄木鸟家庭维修,看看属于哪一个问题

夏天终于要结束了&#xff0c;我只想安静的睡一个好觉。这个夏天中&#xff0c;楼上的空调每夜不休不眠的工作着&#xff0c;可这个空调为什么运作时的声音这么“巨大”。“轰轰轰……”&#xff0c;楼层都似乎和它产生了共振。而每晚的我&#xff0c;反反复复努力入睡&#xf…

05-按钮的基本使用-开发步骤

从Xcode5开始&#xff0c;图片资源都放到Images.xcassets中进行管理先添加必须的图片到Images.xcassets中调整界面尺寸 由于模拟器的默认尺寸是3.5inch&#xff0c;为了避免出现不必要的麻烦&#xff0c;最好将storyboard中的UI界面尺寸也调整为3.5inch添加4个方向按钮和2个缩放…

【机器学习】sklearn数据特征预处理:归一化和标准化

归一化处理 特点&#xff1a;通过对原始数据进行变换把数据映射到(默认为[0,1])之间 from sklearn.preprocessing import MinMaxScaler def mm():"""归一化处理:return: NOne"""mm MinMaxScaler(feature_range(2,3))data mm.fit_transform(…

LeetCode 1848. 到目标元素的最小距离

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff08;下标 从 0 开始 计数&#xff09;以及两个整数 target 和 start &#xff0c;请你找出一个下标 i &#xff0c;满足 nums[i] target 且 abs(i - start) 最小化 。注意&#xff1a;abs(x) 表示 x 的绝对值。…

python环境变量的运用_Windows下python环境变量配置

默认情况下&#xff0c;在windows下安装python之后&#xff0c;系统并不会自动添加相应的环境变量。此时不能在命令行直接使用python命令。1. 首先需要在系统中注册python环境变量&#xff1a;假设python的安装路径为c:\python2.6&#xff0c;则修改我的电脑->属性->高级…

python拆分合并文件_Python 视频文件的分割和合并

import os; import time; os.system(start "wmplayer.exe", "F:\\abc.mp4"); --分割代码 start---- import sys,os; kilobytes 1024; megabytes kilobytes*1024; chunksize int(10*megabytes); def split(fromfile,todir,chunksizechunksize): if not o…

[笔记]Go语言写文件几种方式性能对比

Go语言中写文件有多种方式&#xff0c;这里进行如下几种方式的速度对比&#xff1a; 打开文件&#xff0c;写入内容&#xff0c;关闭文件。如此重复多次打开文件&#xff0c;写入内容&#xff0c;defer 关闭文件。如此重复多次打开文件&#xff0c;重复多次写入内容&#xff0c…

【机器学习】sklearn数据集获取、分割、分类和回归

sklearn数据集1、数据集划分1.1 获取数据1.2 获取数据返回的类型举个栗子&#xff1a;1.3 对数据集进行分割举个栗子&#xff1a;2、 sklearn分类数据集3、 sklearn回归数据集1、数据集划分 机器学习一般的数据集会划分为两个部分&#xff1a; 训练数据&#xff1a;用于训练&a…