机器学习:图文详解密度聚类DBSCAN算法(附Python实现)

news2024/11/29 8:50:58

目录

  • 0 写在前面
  • 1 密度聚类
  • 2 DBSCAN算法
  • 3 Python实现
    • 3.1 算法复现
    • 3.2 可视化实验

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。

🚀详情:机器学习强基计划(附几十种经典模型源码)


1 密度聚类

密度聚类(density-based clustering)的核心原理是通过考察样本分布的紧密程度和可连接性,基于可连接样本不断扩展聚类簇完成聚类过程。

我们用一张图来解释密度聚类的基本概念

在这里插入图片描述

对给定训练集 X = { x 1 , x 2 , ⋯   , x m } X=\left\{ \boldsymbol{x}_1,\boldsymbol{x}_2,\cdots ,\boldsymbol{x}_m \right\} X={x1,x2,,xm},定义如下基本概念:

  • ϵ \epsilon ϵ-邻域:样本 x \boldsymbol{x} x ϵ \epsilon ϵ-邻域定义为 N ϵ ( x ) = { x i ∈ X ∣ d i s t ( x i , x ) ⩽ ϵ } N_{\epsilon}\left( \boldsymbol{x} \right) =\left\{ \boldsymbol{x}_i\in X|\mathrm{dist}\left( \boldsymbol{x}_i,\boldsymbol{x} \right) \leqslant \epsilon \right\} Nϵ(x)={xiXdist(xi,x)ϵ}
  • 密度:样本 x \boldsymbol{x} x的密度定义为 p ( x ) = ∣ N ϵ ( x ) ∣ p\left( \boldsymbol{x} \right) =\left| N_{\epsilon}\left( \boldsymbol{x} \right) \right| p(x)=Nϵ(x)
  • 核心点:若 p ( x ) ⩾ M p\left( \boldsymbol{x} \right) \geqslant M p(x)M则称 x \boldsymbol{x} x是核心点,其中 M M M为核心点邻域最小样本数;
  • 边界点:若在非核心点 x \boldsymbol{x} x ϵ \epsilon ϵ-邻域中存在核心点,则称 x \boldsymbol{x} x为边界点;
  • 噪音点:训练集中除核心点和边界点之外的点为噪音点;
  • 密度直达:若样本 x j \boldsymbol{x}_j xj位于 x i \boldsymbol{x}_i xi ϵ \epsilon ϵ-邻域中且 x i \boldsymbol{x}_i xi为核心对象,则称 x j \boldsymbol{x}_j xj x i \boldsymbol{x}_i xi密度直达;
  • 密度可达:对于样本 x i \boldsymbol{x}_i xi x j \boldsymbol{x}_j xj,若存在样本序列 { p 1 , p 2 , ⋯   , p n } \left\{ \boldsymbol{p}_1,\boldsymbol{p}_2,\cdots ,\boldsymbol{p}_n \right\} {p1,p2,,pn},其中 p 1 = x i \boldsymbol{p}_1=\boldsymbol{x}_i p1=xi p n = x j \boldsymbol{p}_n=\boldsymbol{x}_j pn=xj p i + 1 \boldsymbol{p}_{i+1} pi+1 p i \boldsymbol{p}_i pi密度直达,则称 x j \boldsymbol{x}_j xj x i \boldsymbol{x}_i xi密度可达;
  • 密度相连:对于样本 x i \boldsymbol{x}_i xi x j \boldsymbol{x}_j xj,若存在 x k \boldsymbol{x}_k xk使 x i \boldsymbol{x}_i xi x j \boldsymbol{x}_j xj均由 x k \boldsymbol{x}_k xk密度可达,则称 x i \boldsymbol{x}_i xi x j \boldsymbol{x}_j xj密度相连;

再看上面这张图,根据定义有: x 2 \boldsymbol{x}_2 x2 x 1 \boldsymbol{x}_1 x1密度直达, x 3 \boldsymbol{x}_3 x3 x 1 \boldsymbol{x}_1 x1密度直达, x 3 \boldsymbol{x}_3 x3 x 4 \boldsymbol{x}_4 x4密度相连。

2 DBSCAN算法

DBSCAN算法是密度聚类的经典算法,定义簇 C C C为满足以下性质的非空样本子集:

  • 连接性:对 ∀ x i , x j ∈ C \forall \boldsymbol{x}_i,\boldsymbol{x}_j\in C xi,xjC x i , x j \boldsymbol{x}_i,\boldsymbol{x}_j xi,xj密度相连;
  • 最大性:对 ∀ x i ∈ C \forall \boldsymbol{x}_i\in C xiC,若 x j \boldsymbol{x}_j xj x i \boldsymbol{x}_i xi密度可达,则 x j ∈ C \boldsymbol{x}_j\in C xjC

显然,若 x \boldsymbol{x} x为核心点,则由 x \boldsymbol{x} x密度可达的全体样本

V = { x ′ ∈ X ∣ x ′ 由 x 密度可达 } V=\left\{ \boldsymbol{x}'\in X|\boldsymbol{x}'\text{由}\boldsymbol{x}\text{密度可达} \right\} V={xXxx密度可达}

为一个簇。DBSCAN算法从任意核心点出发,基于密度可达性扩展聚类,完成一簇后再挑选未被选中的核心点重复过程,直至遍历完所有核心点。算法流程如下所示。

在这里插入图片描述

3 Python实现

3.1 算法复现

配合算法流程图来看

  • 初始化

    # 初始化核心点集合
    core = {i: self.dataSet[i] for i in range(self.m) if len(self.__getEpiNeighbor(self.dataSet[i])) >= self.M}
    # 初始化聚类簇数
    k = 0
    kCluster = {}
    # 初始化未访问样本集合
    flag = np.ones(self.m)
    
  • 循环主体

    while len(core) > 0:
        # 生成聚类簇
        k = k + 1
        kCluster[k] = []
        # 随机选取核心点
        o = core.popitem()
        kCluster[k].append(o[1])
        # 初始化队列
        Q = [o]
        # 更新未访问样本集合
        flag[o[0]] = 0
        while len(Q) > 0:
            q = Q.pop(0)
            neighbors = self.__getEpiNeighbor(q[1])
            if len(neighbors) >= self.M:
                for key, value in neighbors.items():
                    if flag[key]:
                        Q.append((key, value))
                        # 设置访问标记
                        flag[key] = 0
                        # 更新簇
                        kCluster[k].append(value)
                        # 更新核心点集
                        if key in core.keys():
                            del core[key]
    

3.2 可视化实验

定义如下可视化函数

def plotGraph(self) -> None:
	kCluster = self.run()
	 for i in kCluster:
	     x = np.array(kCluster[i])[:,0]
	     y = np.array(kCluster[i])[:,1]
	     plt.scatter(x,y)
	 # 绘制噪音向量点的位置
	 xNoise = np.array(self.noise)[:,0]
	 yNoise = np.array(self.noise)[:,1]
	 plt.scatter(xNoise, yNoise, marker='+')
	 plt.title("DBSCAN")
	 plt.show()

在这里插入图片描述
DBSCAN算法的优势是可以自适应地剔除噪音,防止这些异常点影响簇内整体的性质;缺陷是不能手动设置期望聚类的簇数,这点和其他聚类方法不同。

本文完整工程代码联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

在C#的多线程访问中,在线程间的相互访问时因为线程安全问题有访问限制,在创建一般线程时,对于界面元素访问时这样的问题比较常见。 比如,创建一个form1,上面放置一个textbox控件,创建一个线程去访问textbox…

3_SpringMVC_执行流程

1DispatcherServlet:前端控制器 用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。 2…

【学习笔记43】JavaScript的事件

JavaScript的事件一、JS的事件1、事件的三要素2、DOM 0级事件绑定3、DOM 2级事件绑定(事件监听)二、浏览器事件三、鼠标事件1. 左键单击:click2. 双击事件:dblclick3.右键事件:contextmenu4. 鼠标按下事件:mousedown5. 鼠标抬起事…

编写Servlet代码获取页面body中json数据

目录 1、在 maven 项目中引入 jackson 2、编写代码 ① 介绍 jackson 提供操作 json 数据的类和方法 ② 确定 json 数据格式,并写出对应的类 ③ 编写servlet代码 3、使用 postman 发送数据观察结果 4、拓展 readValue 方法返回构造对象的过程 本文使用maven项目&…

HTML5详解

文章目录1 网页基本标签1.2 标题标签1.3 段落标签1.4 换行标签1.5 水平线标签1.6 字体样式标签1.7 注释和特殊符号2 图像、超链接、网页布局2.1 图像2.2 超链接标签2.3 块元素和行内元素2.4 网页布局3 列表、表格、媒体元素、iframe内联框架3.1 列表3.2 表格3.3 媒体元素3.4 if…

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

Unity 之 日志解析工具 Android Logcat一,工具集成1.1 注意事项1.2 导入插件二,连接设备2.1 使用USB连接2.2 无线连接三,实用功能介绍3.1 通用介绍3.2 堆栈跟踪工具 -- 解析Bugly捕获报错一,工具集成 Logcat是开发者必备的工具&a…

ps,查看Linux系统进程信息小帮手-尚文网络xUP楠哥

~~全文共852字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! ps命令在Linux系统中非常的常用,主要是帮助我们查看系统进程的详细信息,其中,…

Jetson Nano如何安装 onnxruntime gpu Python包

Jetson Nano 可以直接 pip 安装 cpu 版本的 onnxruntime 用 pypi 的源,直接安装 onnxruntime-gpu 或者 onnxruntime_gpu 都会报找不到对应的架构 aarch64 本来以为要用官方库编译一下 https://github.com/microsoft/onnxruntime 幸运的是,NVIDIA官方帮…

地级市市场化指数+樊纲市场化指数(包含分省、市两份数据)

一、地级市市场化指数 1、数据来源:各省份年鉴以及地级市统计公报 2、时间跨度:1998-2020年 3、区域范围:422(城市和区) 4、指标说明: 依据樊纲市场化各指标,结合各地级市的相关数据算出来…

Typecho中handsome主题如何增加侧边导航栏

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

【心电信号】小波阙值心电信号去噪【含Matlab源码 2188期】

⛄一、小波阈值法去噪概述 电能质量扰动信号的噪声大多以高斯白噪声的形式存在,利用小波变换对信号进行多分辨率分解,由于小波变换具有去除数据相关性的特点,故可以将有用信号与噪声的能量分离开来。信号中有效的信息主要集中在较大的小波系…

【Vue】Vuex-store

Vuex是什么? Vuex是实现组件全局状态(数据)管理的一种机制,可以方便的实现组件之间数据的共享。 像一个仓库一样! 使用Vuex统一管理状态的好处? 1.能够在vuex中集中管理共享的数据,易于开发和后期维护 2.能…

二叉查找树(1)-二叉树-数据结构和算法(Java)

文章目录1 前言1.1 二叉查找树定义1.2 二叉查找树的性质2 基本实现2.1 API2.2 实现代码2.2.1 数据表示2.2.2 查找2.2.3 插入3 分析4 有序性相关方法与删除操作4.1 最大键和最小键4.2 向上取整和向下取整4.2.1 向下取整floor()4.2.2 向上取整ceiling()4.3 选择select()4.4 排名r…

微服务框架 SpringCloud微服务架构 3 Eureka 3.1 提供者与消费者

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构3 Eureka3.1 提供者与消费者3.1.1 一些概念3.1.2 一个问题3.1.3 总结3 Eur…

【Hack The Box】linux练习-- Pit

HTB 学习笔记 【Hack The Box】linux练习-- Pit 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月27日🌴 🍭…

单片机如何控制外设?

单片机如何控制外设? 单片机不是直接控制外设的,而是通过配置片上外设寄存器来控制其输出和检测高低电平,进而控制外围器件。 单片机如何配置寄存器的? 下图是单片机驱动 点亮发光二极管 内核从flash里面加载读取指令。内核根据指…

将DataFrame中符合指定条件的数据替换为指定的值:mask()函数

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将DataFrame中符合指定条件的数据 替换为指定的值:mask()函数 选择题 下列说法错误的是? import pandas as pd myDF pd.DataFrame({"A":[1,2,3], "B":[4,…

java EE初阶 — 如何进行多线程编程

文章目录1.java如何进行多线程编程1.1 最基础的多线程代码1.2 线程的优势2.java中创建线程的方法2.1 继承Thread 重写run2.2 实现Runnable 接口2.3 使用匿名的内部类,继承 Thread2.4 使用匿名类。继承 Runnable2.5 使用 Lambda 表达式(最简答、最推荐&am…

2000-2020年迪博上市公司内部控制指数

2000-2020年迪博上市公司内部控制指数 1、时间:2000-2020年 2、指标包括: 证券代码、证券简称、辖区、证监会行业、申万行业、内部控制指数、报告期 3、指标解释: 上市公司内部控制指数是结合国内上市公司实施内部控制体系的现状&#x…

java——电商购物平台

1.java编译环境的创建,与所需要用到的插件 (1) 选择的编译器为2022版本的intellij idea 首先新建一个空项目 同时,创建完之后,我们点击 文件 -> 项目结构 进入项目结构,点击项目,选择好你想要的jdk版本,若没有,可以在idea中下载,这里我使用openjdk-19, 点击模…