聚类算法之DBSCAN
DBSCAN聚类算法
1. DBSCAN算法基本概念
DBSCAN
是一种典型的基于密度的聚类算法,基于一组邻域(ϵ,MinPts)(\epsilon, MinPts)(ϵ,MinPts)来描述样本集的紧密程度。其中ϵ\epsilonϵ描述了某一样本的邻域距离阈值,MinPtsMinPtsMinPts描述了某一样本的距离为ϵ\epsilonϵ的邻域中样本个数的阈值。
在DBSCAN
算法中将数据点分为以下三类:
- 核心点:若样本xix_ixi的ϵ\epsilonϵ邻域内至少包含MinPtsMinPtsMinPts样本,即∣Nϵ(xi)∣≥MinPts|N_\epsilon(x_i)| \geq MinPts∣Nϵ(xi)∣≥MinPts,则称样本点xix_ixi为核心点
- 边界点:若样本点xix_ixi的ϵ\epsilonϵ邻域内包含的样本数目小于MinPtsMinPtsMinPts,但是它在其他核心点的邻域内,则称样本点xix_ixi为边界点
- 噪音点:既不是核心点也不是边界点的点
在DBSCAN
算法中还定义了如下概念:
- 密度直达:若样本点xjx_jxj在核心点xix_ixi的ϵ\epsilonϵ邻域内,则称样本点xjx_jxj由xix_ixi密度直达。
- 密度可达:若在样本点xi,1x_{i,1}xi,1和样本点xi,nx_{i,n}xi,n之间存在序列xi,2,...,xi,n−1x_{i,2},...,x_{i,n-1}xi,2,...,xi,n−1,且xi,j+1x_{i,j+1}xi,j+1由xi,jx_{i,j}xi,j密度直达,则称xi,nx_{i,n}xi,n由xi,1x_{i,1}xi,1密度可达。由密度直达的定义可知,样本点xi,1,xi,2,...,xi,n−1x_{i,1},x_{i,2},...,x_{i,n-1}xi,1,xi,2,...,xi,n−1均为核心点
- 密度连接:对于样本点xix_ixi和样本点xjx_jxj,若存在样本点xkx_kxk,使得xix_ixi和xjx_jxj都由xkx_kxk密度可达,则称xix_ixi和xjx_jxj密度相连
上图MinPts=5MinPts=5MinPts=5,红色的样本都是核心点,因为其ϵ\epsilonϵ邻域至少有5个样本。黑色的样本是非核心点,其中红色样本邻域内的黑色样本为边界点,其他黑色样本为噪音点。所有核心点密度直达的样本在以红色样本为中心的超球体内,如果不在超球体内,则不能密度直达。图中用绿色箭头连起来的核心点组成了密度可达的样本序列。在这些密度可达的样本序列的ϵ\epsilonϵ邻域内所有的样本相互都是密度相连的。
2. DBSCAN聚类算法流程
输入:样本集D={x1,x2,...,xn},邻域参数(ϵ,MinPts),样本距离度量方式输入:样本集D=\{x_1,x_2,...,x_n\},邻域参数(\epsilon,MinPts),样本距离度量方式输入:样本集D={x1,x2,...,xn},邻域参数(ϵ,MinPts),样本距离度量方式
输出:簇划分C={C1,C2,...,Ck}输出:簇划分C=\{C_1,C_2,...,C_k\}输出:簇划分C={C1,C2,...,Ck}
初始化核心点集合Ω=∅\Omega=\varnothingΩ=∅,初始化聚类簇数k=0k=0k=0,初始化为访问集合Γ=D\Gamma=DΓ=D,簇划分C=∅C=\varnothingC=∅
对于i=1,2,...,ni=1,2,...,ni=1,2,...,n,按下面步骤找出所有的核心点:
- 通过距离度量方式,找到样本xix_ixi的ϵ\epsilonϵ邻域子样本集Nϵ(xi)N_\epsilon(x_i)Nϵ(xi)
- 如果子样本集样本个数满足∣Nϵ(xi)∣≥MinPts|N_\epsilon(x_i)| \geq MinPts∣Nϵ(xi)∣≥MinPts,将样本xix_ixi加入核心点集合:Ω=Ω∪{xi}\Omega=\Omega \cup \{x_i\}Ω=Ω∪{xi}
如果核心点集合Ω=∅\Omega=\varnothingΩ=∅,结束,否则转入步骤4
在核心点集合Ω\OmegaΩ中,随机选择一个核心点ooo,初始化当前簇核心点队列Ωcur={o}\Omega_{cur}=\{o\}Ωcur={o},初始化类别序号k=k+1k=k+1k=k+1,初始化当前簇样本集合Ck={o}C_k=\{o\}Ck={o},更新为访问样本集合Γ=Γ−{o}\Gamma=\Gamma-\{o\}Γ=Γ−{o}
如果当前核心点队列Ωcur=∅\Omega_{cur}=\varnothingΩcur=∅,则当前簇CkC_kCk生成完毕,更新簇划分C={C1,C2,...,Ck}C=\{C_1,C_2,...,C_k\}C={C1,C2,...,Ck},更新核心点集合Ω=Ω−Ck\Omega=\Omega-C_kΩ=Ω−Ck,转入步骤3。否则更新核心点集合Ω=Ω−Ck\Omega=\Omega-C_kΩ=Ω−Ck
在当前簇核心点队列Ωcur\Omega_{cur}Ωcur中取出一个核心点o′o'o′,通过邻域阈值ϵ\epsilonϵ找出所有的ϵ\epsilonϵ邻域子样本集Nϵ(o′)N_\epsilon(o')Nϵ(o′),令Δ=Nϵ(o′)∩Γ\Delta=N_\epsilon(o') \cap \GammaΔ=Nϵ(o′)∩Γ,更新当前簇样本集合Ck=Ck∪ΔC_k=C_k \cup \DeltaCk=Ck∪Δ,更新为访问样本集合Γ=Γ−Δ\Gamma = \Gamma - \DeltaΓ=Γ−Δ,更新Ωcur=Ωcur∪(Δ∩Ω)−{o′}\Omega_{cur}=\Omega_{cur} \cup (\Delta \cap \Omega)-\{o'\}Ωcur=Ωcur∪(Δ∩Ω)−{o′},转入步骤5
简单来说:
- 根据给定的邻域参数ϵ\epsilonϵ和MinPtsMinPtsMinPts确定所有的核心点
- 对每一个核心点
- 选择一个未处理过的核心点,找到由其密度可达的样本生成聚类‘簇’
- 重复以上过程
3. 实例演示
import numpy as np
import matplotlib.pyplot as plt from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScalernp.random.seed(0)# 构建数据
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=0.5, noise=0.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=0.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)data_sets = [(noisy_circles,{"eps": 0.3,"min_samples": 5}),(noisy_moons,{"eps": 0.3, "min_samples": 5}), (blobs, {"eps": 0.3, "min_samples": 5})
]
colors = ["#377eb8", "#ff7f00", "#4daf4a"]plt.figure(figsize=(15, 5))for i_dataset, (dataset, algo_params) in enumerate(data_sets):# 模型参数params = algo_params# 数据X, y = datasetX = StandardScaler().fit_transform(X)# 创建DBSCANdbscan = cluster.DBSCAN(eps=params["eps"], min_samples=params['min_samples'])# 训练dbscan.fit(X)# 预测y_pred = dbscan.labels_.astype(int)y_pred_colors = []for i in y_pred:y_pred_colors.append(colors[i])plt.subplot(1, 3, i_dataset+1)plt.scatter(X[:, 0], X[:, 1], color=y_pred_colors)plt.show()
4. DBSCAN小结
优点:
- 可以对任意形状的稠密数据集进行聚类,相对的,
K-Means
、Mean Shift
之类的聚类算法一般只适用于凸数据集 - 可以在聚类的同时发现异常点,对数据集中的异常点不敏感。
- 聚类结果没有偏倚,相对的,
K-Means
之类的聚类算法初始值对聚类结果有很大影响。
缺点:
- 如果样本集的密度不均匀、聚类间距差相差很大时,聚类质量较差,这时用
DBSCAN
聚类一般不适合。 - 如果样本集较大时,聚类收敛时间较长,此时可以对搜索最近邻时建立的
KD
树或者球树进行规模限制来改进。 - 调参相对于传统的
K-Means
之类的聚类算法稍复杂,主要需要对距离阈值ϵ\epsilonϵ,邻域样本数阈值MinPtsMinPtsMinPts联合调参,不同的参数组合对最后的聚类效果有较大影响。
聚类算法之DBSCAN相关推荐
- (3)聚类算法之DBSCAN算法
文章目录 1.引言 2.`DBSCAN`相关定义 3.`DBSCAN`密度聚类思想 3.1 `DBSCAN`算法定义 3.2 DBSCAN算法流程 4.`DBSCAN`算法实现 4.1 使用`nump ...
- 机器学习-无监督学习-聚类:聚类方法(二)--- 基于密度的聚类算法【DBSCAN文本聚类算法,密度最大值文本聚类算法】
密度聚类方法的指导思想是,只要样本点的密度大于某阀值,则将该样本添加到最近的簇中. 基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一 ...
- 聚类算法(part1)--DBSCAN
学习笔记,仅供参考,有错必纠 参考书目:<数据挖掘导论>:<R语言实战>:<应用预测建模>;<R语言与数据挖掘>:等 聚类 密度聚类 基于密度的聚类寻找 ...
- 聚类算法Clustering-KMeans/DBSCAN/DenPeak/NormalizeCut/RCC
本文结构安排 经典聚类算法:线性聚类 Kmeans 经典聚类算法:非线性聚类 DBSCAN.谱聚类 新兴聚类算法:DenPeak,RCC K-means K-means clustering is a ...
- 基于密度的聚类算法:DBSCAN
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法.与划分和层次聚类方法不同, ...
- 聚类算法之DBSCAN算法之一:经典DBSCAN
DBSCAN是基于密度空间的聚类算法,与KMeans算法不同,它不需要确定聚类的数量,而是基于数据推测聚类的数目,它能够针对任意形状产生聚类. 1.epsilon-neighborhood epsoi ...
- 机器学习8—聚类算法之DBSCAN和Birch算法
聚类算法 一.基于密度的聚类DBSCAN算法 1.1DBSCAN算法的基本概念 1.2DBSCAN算法参数选择 1.3DBSCAN算法原理 1.4DBSCAN算法中dbscan()函数的说明 1.5D ...
- java dbscan_聚类算法之DBScan(Java实现)
DBScan是一种基于密度的聚类算法,它有一个核心点的概念:如果一个点,在距它Eps的范围内有不少于MinPts个点,则该点就是核心点.核心和它Eps范围内的邻居形成一个簇.在一个簇内如果出现多个点都 ...
- R实现K均值算法,层次聚类算法与DBSCAN算法
1.聚类的基本概念 聚类分析(cluster analysis)仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组.其目标是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不 ...
- 聚类算法之DBScan(Java实现)[转]
package orisun;import java.io.File; import java.util.ArrayList; import java.util.Vector; import java ...
最新文章
- java group类_浅析Java中线程组(ThreadGroup类)
- 通过 P3P规范让IE跨域接受第三方cookie session
- 如何编写常见语言带默认参数值的函数
- 【PAT】B1070 结绳(25 分)
- appium+python自动化57-chromedriver与chrome版本
- 视频跟踪——meanshift算法
- 数据结构图之一(基本概念,存储结构,两种遍历)
- Tomcat部署记事
- 25.go doc 与 godoc
- 嵌入式Linux设备驱动程序开发指南18(IIO子系统(二)具有硬件触发功能的IIO子系统ADC模块)——读书笔记
- 5G NR标准 第9章 传输信道处理
- 前端食堂技术周刊第 82 期:Vue3.3、Google I/O、CSS In 2023、Remix Conf 2023、Rollup 中文文档、React 中文文档
- 大学生生涯职业规划计算机专业,大学生职业生涯规划书计算机专业范文
- [PB] PB中读写文件通用的两个函数
- Web前端期末大作业-响应式艺术培训机构网页设计(bootstrap+HTML+CSS+JavaScript+)实现
- 控制系统分析2(线性系统稳定性、和可控性)
- 如何估算剩余的bug数量
- 基于Andriod的连锁药店管理系统APP-计算机毕业设计
- 30个特别酷的SharePoint站点
- 如何利用音乐合成软件将多段音频合并为一段?可以试试这个方法