异常检测算法之DBSCAN算法讲解与Python实现

异常检测算法之DBSCAN算法讲解与Python实现

  • 编写该文初衷
  • DBSCAN是什么
  • DBSCAN三个核心概念
  • DBSCAN工作原理
  • DBSCAN 算法的优点
  • DBSCAN 算法的局限性
  • DBSCAN算法的Python实现

编写该文初衷

网上写DBSCAN的文章很多,但是问多文章写了无数字,但是看完还是让人觉得云里雾里的。DBSCAN设计其实非常简单,该文同样力争以简洁的方式讲述DBSCAN,尽量让大家能轻易看懂。

DBSCAN是什么

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,基于密度的聚类算法)是一种用于聚类分析的无监督学习算法。

DBSCAN三个核心概念

DBSCAN 的核心概念包括核心点、边界点和噪声点,理解了这三个核心概念DBSCAN就算懂了:

  1. 核心点:在给定半径(Eps)内含有不少于 MinPts 个点的点。
  2. 边界点:在核心点的邻域内,但本身不是核心点的点。
  3. 噪声点:既不是核心点也不是边界点的点。

DBSCAN工作原理

DBSCAN 算法的工作原理如下:

  1. 初始化参数:DBSCAN算法需要两个参数,eps(邻域半径)和min_samples(一个簇中所需的最小点数)。eps定义了两个点被认为是邻域内的距离,min_samples定义了形成稠密区域所需的最小点数。

  2. 标记访问状态:为数据集中的每个点设置一个访问状态,初始时所有点都未被访问。

  3. 选择起始点:从数据集中选择一个未访问过的点作为起始点。这个点可以是随机选择的,也可以是按照某种顺序(如索引顺序)选择的第一个点。选择起始点的目的是为了开始探索数据点的邻域。

  4. 探索邻域:对于当前选择的点,检查其eps邻域内的所有点。如果邻域内的点数大于或等于min_samples,则当前点被认为是一个核心点。

  5. 形成簇:如果当前点是核心点,那么它和它的所有邻域点一起形成一个簇。将这些点标记为已访问,并为它们分配一个相同的簇标识符。

  6. 递归扩展:对于新加入簇的点,如果它们也是核心点,那么继续递归地探索它们的邻域点,并将满足条件的点加入到当前簇中。

  7. 处理边界点:如果一个点不是核心点,但它的邻域内至少有一个核心点,那么这个点被认为是边界点,也被加入到簇中,并标记为已访问。

  8. 识别噪声点:如果一个点既不是核心点也不是边界点,那么它被认为是噪声点,通常被标记为-1。

  9. 重复处理:重复步骤3到8,直到所有未访问的点都被处理完毕。

  10. 结束聚类:当所有点都被访问过,并且每个点都被分配到了一个簇或被标记为噪声点时,聚类过程结束。

通过上述步骤,DBSCAN算法能够识别出数据中的簇和噪声点,而不需要预先指定簇的数量。这种方法特别适用于那些簇形状不规则或数据中包含噪声的情况。

DBSCAN 算法的优点

  1. 可以发现任意形状的簇,不像 K-Means 算法只能发现凸形的簇。
  2. 对噪声数据不敏感,能够有效识别噪声点。
  3. 不需要事先指定簇的数量。

DBSCAN 算法的局限性

  1. 对于高维数据,半径(Eps)和最小点数(MinPts)的选择比较困难。
  2. 算法的时间复杂度较高,尤其是在处理大规模数据时。

在实际应用中,DBSCAN 常用于数据分析、图像处理、地理信息系统等领域,帮助我们发现数据中的自然分组和异常点。

DBSCAN算法的Python实现

import numpy as npdef euclidean_distance(point1, point2):"""计算两点之间的欧几里得距离参数:point1 (numpy.ndarray):第一个点的坐标point2 (numpy.ndarray):第二个点的坐标返回:float:两点之间的欧几里得距离"""return np.sqrt(np.sum((point1 - point2) ** 2))class DBSCAN:def __init__(self, eps, min_samples):"""DBSCAN 类的初始化函数参数:eps (float):邻域半径min_samples (int):形成一个聚类所需的最小样本数"""self.eps = epsself.min_samples = min_samplesself.labels = None  # 用于存储每个数据点的聚类标签def fit(self, X):"""执行 DBSCAN 聚类算法参数:X (numpy.ndarray):输入的数据集"""n_samples = X.shape[0]  # 获取数据点的数量self.labels = np.full(n_samples, -1)  # 初始化所有标签为 -1,表示未分类cluster_id = 0  # 聚类标签的初始值for i in range(n_samples):  # 遍历每个数据点if self.labels[i]!= -1:  # 如果已经分类,跳过continueneighbors = self.find_neighbors(X, i)  # 找到当前点的邻域点if len(neighbors) < self.min_samples:  # 如果邻域点数量少于最小样本数,标记为噪声点self.labels[i] = -1else:  # 否则,开始扩展聚类cluster_id += 1self.expand_cluster(X, i, neighbors, cluster_id)  # 扩展聚类def find_neighbors(self, X, index):"""找到给定索引的数据点的邻域点参数:X (numpy.ndarray):输入的数据集index (int):数据点的索引返回:list:邻域点的索引列表"""neighbors = []for i in range(X.shape[0]):  # 遍历所有数据点if euclidean_distance(X[index], X[i]) <= self.eps:  # 如果距离小于邻域半径,加入邻域列表neighbors.append(i)return neighborsdef expand_cluster(self, X, index, neighbors, cluster_id):"""扩展聚类参数:X (numpy.ndarray):输入的数据集index (int):当前点的索引neighbors (list):当前点的邻域点索引列表cluster_id (int):当前聚类的标签"""self.labels[index] = cluster_id  # 标记当前点为当前聚类i = 0while i < len(neighbors):  # 遍历邻域点neighbor_index = neighbors[i]if self.labels[neighbor_index] == -1:  # 如果邻域点未分类new_neighbors = self.find_neighbors(X, neighbor_index)  # 找到其邻域点if len(new_neighbors) >= self.min_samples:  # 如果邻域点的邻域满足最小样本数要求neighbors.extend(new_neighbors)  # 扩展邻域列表if self.labels[neighbor_index] == -1:  # 如果邻域点未分类,标记为当前聚类self.labels[neighbor_index] = cluster_idi += 1

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

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

相关文章

【Matlab 路径优化】基于蚁群算法的XX市旅游景点线路优化系统

基于蚁群算法的XX市旅游景点线路优化系统 &#xff08;一&#xff09;客户需求&#xff1a; ①考虑旅游景点的空间分布、游客偏好等因素&#xff0c;实现了旅游线路的智能规划 ②游客选择一景点出发经过所要游览的所有景点只一次&#xff0c;最后回到出发点的前提下&#xf…

2024年洗地机哪个牌子好?内行人最建议这4个:清洁力口碑公认都不错

在当代生活中&#xff0c;洗地机可以称得上是一款必备“神器”&#xff0c;劳累的清洁、繁忙的时间、漫天纷飞的宠物毛发&#xff0c;都是家庭清洁面前的一座座大山。而洗地机的出现&#xff0c;完美解决了这些问题&#xff0c;既节约出了很多时间&#xff0c;又达到了很好的清…

14-11 2024 年的 13 个 AI 趋势

2024 年的 13 个 AI 趋势 人工智能对环境的影响和平人工智能人工智能支持的问题解决和决策针对人工智能公司的诉讼2024 年美国总统大选与人工智能威胁人工智能、网络犯罪和社会工程威胁人工智能治疗孤独与对人工智能的情感依赖人工智能影响者中国争夺人工智能霸主地位人工智能…

PyTorch - 神经网络基础

神经网络的主要原理包括一组基本元素&#xff0c;即人工神经元或感知器。它包括几个基本输入&#xff0c;例如 x1、x2… xn &#xff0c;如果总和大于激活电位&#xff0c;则会产生二进制输出。 样本神经元的示意图如下所述。 产生的输出可以被认为是具有激活电位或偏差的加权…

学会python——用python制作一个登录和注册窗口(python实例十八)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.登录和注册窗口 3.1 代码构思 3.2 代码实例 3.3 运行结果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读…

snat、dnat和firewalld

目录 概述 SNAT源地址转换 DANT目的地址转换 抓包 firewalld 端口管理 概述 snat &#xff1a;源地址转换 内网——外网 内网ip转换成可以访问外网的ip 也就是内网的多个主机可以只有一个有效的公网ip地址访问外部网络 DNAT&#xff1a;目的地址转发 外部用户&#…

sql业务场景分析思路参考

1、时间可以进行排序&#xff0c;也可以用聚合函数对时间求最大值max&#xff08;时间&#xff09; 例如下面的例子&#xff1a;取最晚入职的人&#xff0c;那就是将入职时间倒序排序&#xff0c;然后limit 1 表&#xff1a; 场景&#xff1a;查找最晚入职员工的所有信息 se…

实现原理:远程过程调用(RPC)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【探索Linux】P.37(传输层 —— TCP协议通信机制 | 确认应答(ACK)机制 | 超时重传机制)

阅读导航 引言一、确认应答(ACK)机制1. 成功接收2. 过程中存在丢包3. 引入序列号&#xff08;1&#xff09;序列号的定义&#xff08;2&#xff09;序列号的作用&#xff08;3&#xff09;序列号的工作原理&#xff08;4&#xff09;序列号和确认应答号 二、超时重传机制1. 超时…

flask项目部署总结

这个部署的时候要用虚拟环境&#xff0c;cd进项目文件夹 python3 -m venv myenv source myenv/bin/activate激活 之后就安装一些库包之类的&#xff0c;&#xff08;flask&#xff0c;requests,bs4,等等&#xff09; 最重要的是要写.flaskenv文件并且pip install 一个能运行…

Android14之获取包名/类名/服务名(二百二十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Java类和对象详解

1.类与对象的初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 JAVA是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 面向过…

底层软件 | 十分详细,为了学习设备树,我写了5w字笔记!

0、设备树是什么&#xff1f;1、DTS 1.1 dts简介1.2 dts例子 2、DTC&#xff08;Device Tree Compiler&#xff09;3、DTB&#xff08;Device Tree Blob&#xff09;4、绑定&#xff08;Binding&#xff09;5、Bootloader compatible属性 7、 #address-cells和#size-cells属性8…

Elasticsearch 使用误区之二——频繁更新文档

在使用 Elasticsearch 时&#xff0c;频繁更新文档是一种常见误区。这不仅影响性能&#xff0c;还可能导致系统资源的浪费。 理解 Elasticsearch 的文档更新机制对于优化性能至关重要。 关于 Elasticsearch 更新操作&#xff0c;常见问题如下&#xff1a; ——https://t.zsxq.c…

MySQL学习(5):SQL语句之数据查询语言:DQL

1.DQL语法 select 字段列表 from 表名列表 #DQL是可以进行多表查询的 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数 2.基本查询&#xff08;select&#xff09; 2.1查询多字段 select 字段1,字段2,字段3,......fro…

Linux/Ubuntu访问局域网共享文件夹

文件夹中找到“Other Location”&#xff0c;输入“smb:IP地址/共享文件夹名称”&#xff0c;然后点击connect后者直接回车即可&#xff01; End&#xff01;

【51单片机入门】矩阵键盘

文章目录 前言矩阵键盘介绍与检测原理原理图代码讲解总结 前言 在嵌入式系统设计中&#xff0c;键盘输入是一种常见的人机交互方式。其中&#xff0c;矩阵键盘因其简单、方便和易于扩展的特性&#xff0c;被广泛应用于各种设备中。本文将介绍如何使用51单片机来实现矩阵键盘的…

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系&#xff08;一&#xff09;   2.芯片CRA角度与镜头选型的匹配关…

【MySQL系列】隐式转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于Java的壁纸网站设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…