【机器学习】DBSCAN聚类算法

article/2025/8/24 17:51:38

DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。

1.基本概念

  • 核心对象:若某个点的密度达到算法设定的阈值则其为核心点。(即r的 ϵ \epsilon ϵ邻域内点的数量不小于minPts )。其中minPts是自己设定的点的个数,即以r为圆心的圆包含的点的个数大于minPts,那么它就是一个核心对象
  • ϵ \epsilon ϵ-邻域的距离阈值∶设定的半径ε。
  • 直接密度可达︰若某点p在点q的 ϵ \epsilon ϵ邻域内,且q是核心点,则 p → q p \rightarrow q pq直接密度可达。可以理解为p在核心点q的圆内。
  • 密度可达∶若有一个关于点的序列 q 0 , q 1 , … , q k q_0,q_1,\dots,q_k q0,q1,,qk,若 i ∈ [ 1 , k ] , q i − 1 → q i i \in [1,k], q_{i-1} \rightarrow q_{i} i[1,k],qi1qi是直接密度可达的,则称从 q 0 到 q k q_0到q_k q0qk密度可达,这实际上是直接密度可达的“传播”。
  • 边界点:属于某一个类的非核心点,即它的邻域内的点少于minPts,但它在某个核心点的 ϵ \epsilon ϵ-邻域内。
  • 噪声点:不属于任何一个类簇的点,即任何一个核心点都不包括这个点,从任何一个核心点到这个点都是密度不可达的。

需要指定的参数:阈值minPts以及半径ε。

可用于异常点的检测。

2.参数选择

半径 ϵ \epsilon ϵ:找突变点

K距离:对于数据集P={p(i);i=0,1,…,n},计算点P(i)到P的子集S的距离并从小到大排序,找到距离突变的点,则认为突变点前面的距离比较合适。

minPts:K距离中的K值,一般取小一点,多次尝试

3.算法思路

对于数据集D:
首先将所有数据都标记为unvisited;DO
任取一个未标记数据点p:
将p标记为visited;if p是核心点:
​		将其添加到新的簇C中;
​		将p邻域中的每个点添加到N中;for p' in N:if p'是 unvisited:
​				将p'标记为visited;if p'是核心点:​				将p'邻域内的点添加到N中;if p'未被分配到簇中,将其添加到簇C中;else p为噪声,将其添加到-1簇中;
Until 没有unvisited的对象

4.优缺点

优点:

  • 不需要指定簇的个数
  • 只需要两个参数(半径r和阈值minPts)
  • 擅长找到离群点(用于异常值监测)

缺点:

  • 高维数据有点困难
  • 参数难以选择
  • SKlearn中效率很慢

5.python代码实现

数据集

1.导入相关包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.读取数据

data = pd.read_csv("./data/dataset1.csv",header=None)
data = data.values.tolist()

3.画出原始图像

# 画出原始图像
fig, ax = plt.subplots()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = Falseplt.scatter([i[0] for i in data], [i[1] for i in data])
plt.show()

在这里插入图片描述

4.计算欧氏距离

def cal_dist(a,b):"""计算欧氏距离"""a = np.array(a)b = np.array(b)dist = np.sqrt(np.dot((a-b),(a-b).T))return dist

5.获取某个点邻域内的点的个数以及列表

def find_neibors(p,epsilon,data):"""获取某个点邻域内的点的个数以及列表"""neibors = [] #用于存储这个点邻域内的点for q in data:dist = cal_dist(p,q)if dist <= epsilon:neibors.append(q)cnt = len(neibors)return cnt,neibors

6.返回一个未被选择点.若没有未选择点,返回-1

def get_unvisited(selected):"""返回一个未被选择点.若没有未选择点,返回-1"""for i in range(len(selected)):if selected[i] == 0:return ireturn -1

7.判断是否将q添加到簇中

def is_in_clusters(q,all_clusters):"""判断是否将q添加到簇中"""for clusters in all_clusters:if q in clusters:return Truereturn False

8.设置参数

# 设置参数
minPts = 3
epsilon = 1.0

9.算法实现

def DBSCAN(epsilon,minPts,data):"""DBSCAN算法"""all_clusters = [] # 所有簇noiseList = []selected = [0 for i in range(len(data))]while get_unvisited(selected) != -1:C = [] # 保存同一个簇的点i = get_unvisited(selected) # 找未选择点selected[i] = 1 # 修改选择状态p = data[i]cnts,neibors = find_neibors(p,epsilon,data) #获取邻域内的点if cnts > minPts: # p为核心点C.append(p) # 将p添加到簇中for q in neibors: # 遍历核心点p的邻域点if selected[data.index(q)] == 0:selected[data.index(q)] = -1#???q_cnt,q_neibors = find_neibors(q,epsilon,data)if q_cnt > minPts: # 如果q是核心点,将其邻域内的点添加到neibors中for i in q_neibors:if i not in neibors:neibors.append(i)#判断q是否已经添加到簇if not is_in_clusters(q,all_clusters):C.append(q)else:noiseList.append(p)if len(C) != 0:all_clusters.append(C) #找完一个簇,添加到all_clusters中all_clusters.append(noiseList) # 将噪声点添加到all_clusters中return all_clusters            

10.运行并展示聚类结果

if __name__ == "__main__":all_clusters = DBSCAN(epsilon,minPts,data)    fig,ax = plt.subplots()n = len(all_clusters)for i in range(len(all_clusters)):cluster = all_clusters[i]if i!= len(all_clusters) -1:ax.scatter([j[0] for j in cluster],[j[1] for j in cluster])else:ax.scatter([j[0] for j in cluster],[j[1] for j in cluster],label="noise",c='purple')plt.legend()plt.show()

在这里插入图片描述
查看调库实现的类别数量:
在这里插入图片描述

调库实现DBSCAN

from sklearn.cluster import DBSCAN
db = DBSCAN(eps=epsilon,min_samples=minPts)
db.fit(data)
plt.scatter([i[0] for i in data],[i[1] for i in data],c = db.labels_)
plt.show()

在这里插入图片描述


http://chatgpt.dhexx.cn/article/27YpkHUU.shtml

相关文章

30款APP源码打包 Java Android安卓App源码 30款打包下载

[30款APP源码打包 Java Android安卓App源码 30款打包下载](访问密码: 168168)(https://474b.com/file/29013429-461457489)

【Android】Android源码下载

学而不思则罔&#xff0c;思而不学则殆 【Android】Android源码下载 一.环境准备虚拟机Ubuntu系统 二.Android源码下载Ubuntu下载1.repo下载2.修改源代码镜像地址3.初始化仓库4.指定版本5.同步源码树 Windows下载1.repo下载2.修改源代码镜像地址3.初始化仓库4.指定版本5.同步源…

下载Android源码流程(完整版)

要在Linux环境下操作&#xff0c;要在Linux环境下操作&#xff0c;要在Linux环境下操作~~ 不要想在Windows环境下操作&#xff0c;因为会有各种问题。Windows环境的童鞋又不想装双系统的可以跟着下面的操作&#xff0c;Linux的童鞋可以直接跳过看。Mac的童鞋就略过~~~ &#x…

Android系统源码下载

1&#xff0c;ubuntu电脑 2&#xff0c;下载 repo 工具: mkdir ~/bin PATH~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod ax ~/bin/repo3&#xff0c; 建立工作目录: mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY4&am…

Android系统源码_下载编译——从下载系统源码到编译系统镜像

前言 近期因工作原因&#xff0c;需要频繁编译、调试Android源码 &#xff0c;特别是修改framework层的源码&#xff0c;经过不懈努力&#xff0c;终于可以正常调试了。 这里进行一些总结和分享。 参考文章&#xff1a;清华镜像之Android 镜像使用帮助、Android系统源码编译 …

下载并编译Android源码

下载编译源码 系统架构&#xff1a; Linux&#xff1a;Linux内核和驱动模块&#xff08;USB Camera 蓝牙等&#xff09; Libraries&#xff1a;提供动态库&#xff0c;Android运行时库、Dalvik虚拟机等&#xff0c;大部分是C 和C写的&#xff0c;可以看成是native层 Framewo…

一、安卓系统源码下载

前言&#xff1a;为了研究安卓系统&#xff0c;我们需要下载安卓源码&#xff0c;本篇博文参考安卓官网https://source.android.com &#xff0c;对安卓系统各个版本源码的下载做出了详细解释。 一、环境要求概览 在下载编译安卓系统源码前&#xff0c;我们必须对各个版本安卓…

从github下载最新Android源码

今年5月底开始&#xff0c;谷歌彻底被墙&#xff0c;所有谷歌的网站都不能访问了&#xff0c;这次包括了android.org&#xff0c;googlesource.com&#xff0c;code.google.com。Android官方的资源不能访问&#xff0c;想下载Android代码当然是困难重重了。 本文就为大家解决这…

Android源码下载编译(TI)

0 前言 通过《Android源码下载 & 编译&#xff08;高通&#xff09;》的方法下载的源码是包含有kernel目录的&#xff08;也就是包含Linux内核&#xff09;&#xff0c;然而&#xff0c;通过其它方法下载的源码可能并不包含kernel目录&#xff08;也就是不包含Linux内核&am…

安卓系统源码、内核下载

一、下载源码 以下载源码2.3.7版本为例 环境ubuntu14.04 1、安装git sudo apt-get install git git --version //查看版本 git config --global user.name "zhangsan" //设置用户名 git config --global user.email "zhangsan163.com" //设置邮箱 git…

AOSP安卓源码下载

Android源码下载 在国内想下载Android要么科学上网&#xff0c;要么使用国内搭建的镜像&#xff0c;有清华镜像&#xff0c;中科大的镜像网站。这里使用清华镜像网站镜像Android源码的下载清华镜像网站地址&#xff0c;为啥我要写这篇笔记嘞&#xff0c;虽然网上有很多这方便的…

安卓系统源码编译系列(一)——下载安卓系统源码教程

最近需要编译安卓系统&#xff0c;咨询了一个编译过安卓系统的朋友&#xff0c;说是下载源码就得下载两天&#xff0c;于是做好了长期抗战的准备&#xff0c;开始了下载安卓源码的旅程。在刚开始下载时&#xff0c;可以参照的内容只有官方教程&#xff0c;于是跟着官方教程一步…

【Android】系统源码下载及编译

源码及编译 步骤 1&#xff1a;创建一个空目录来存放源码&#xff1a; mkdir aosp cd aosp步骤 2&#xff1a;获取最新版本的 repo 并签出 android-8.1.0_r1 分支&#xff1a; repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1其中&am…

Android源码下载编译(高通)

0 前言 本文介绍如何下载高通平台的Android源码&#xff0c;然后进行编译。 相关&#xff1a;《Android源码下载&编译&#xff08;TI&#xff09;》 1 安装工具 下载Android源码需要git&#xff0c;repo等工具&#xff0c;启动repo是Google写的一个专门用于下载Android源码…

Window下载Android源码

Android 10源码下载 想要研究Android 源码的同学可以用此方法进行下载。源码从清华大学开源软件镜像站&#xff08;https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/&#xff09;下载。 使用Linux的同学直接参照清华镜像站提供的使用帮助(https://mirrors.tuna.tsinghua.edu…

下载安卓源码

安卓内核源码下载教程 准备环境如何选择你想要下载的版本ubuntu环境配置 准备环境 Ubuntu 18.04 安装 最好是用这个版本或者高于这个版本的,低版本的有一些环境问题可能会让你很难受我使用的是VMware Workstation 16 ProPixel 3 XL、Pixel 3、Pixel 2 XL、Pixel 2、Pixel XL、…

Android13源码下载及全编译流程

一、源码下载 1.1、配置要求 官方推荐配置请参考&#xff1a;https://source.android.google.cn/docs/setup/start/requirements?hlzh-cn&#xff0c;重点有如下几项&#xff1a; 1.1.1、硬件配置要求 1、内存至少 16GB&#xff0c;实测建议至少 32G。 2、磁盘至少 250GB&am…

Java 工厂设计模式

简介 工厂设计模式在java中有大量的应用&#xff0c;如spring框架&#xff0c;这种类型的设计模式属于创建型模式。在工厂设计模式中&#xff0c;创建逻辑不会对客户端暴露&#xff0c;可以通过一个对外接口创建所需对象。 工厂模式使用场景 需要频繁创建对象且这些对象多处…

简单工厂设计模式

简单工厂设计模式 刚开始学设计模式,犹如刚睁开眼看世界的孩子,满眼都是惊奇,原来代码的世界可以如此的精彩纷呈.当然这些都是前辈智慧的结晶.简单工厂设计模式是接触的第一个设计模式,看完后更多的是不懂和迷糊.不过相信慢慢会懂得其精髓的. 简单工厂设计模式是创建型(就是把对…

Java工厂设计模式详解

前言 工厂设计模式在开发过程中有大量的运用&#xff0c;不管是spring框架&#xff0c;还是诸多的中间件&#xff0c;都有着工厂设计模式的体现 比如&#xff0c;手机生产工厂&#xff0c;当提供了相关生产手机的原材料&#xff0c;工厂就可以按要求生产出手机 工厂模式介绍 …