DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在噪声的空间数据库中发现任意形状的聚类。

DBSCAN中的几个定义:
Ε邻域:给定对象半径为Ε内的区域称为该对象的Ε邻域;
核心对象:如果给定对象Ε领域内的样本点数大于等于MinPts,则称该对象为核心对象;
直接密度可达:对于样本集合D,如果样本点q在p的Ε领域内,并且p为核心对象,那么对象q从对象p直接密度可达。
密度可达:对于样本集合D,给定一串样本点p1,p2….pn,p= p1,q= pn,假如对象pi从pi-1直接密度可达,那么对象q从对象p密度可达。
密度相连:存在样本集合D中的一点o,如果对象o到对象p和对象q都是密度可达的,那么p和q密度相联。
可以发现,密度可达是直接密度可达的传递闭包,并且这种关系是非对称的。密度相连是对称关系。DBSCAN目的是找到密度相连对象的最大集合。
Eg: 假设半径Ε=3,MinPts=3,点p的E领域中有点{m,p,p1,p2,o}, 点m的E领域中有点{m,q,p,m1,m2},点q的E领域中有点{q,m},点o的E领域中有点{o,p,s},点s的E领域中有点{o,s,s1}.
那么核心对象有p,m,o,s(q不是核心对象,因为它对应的E领域中点数量等于2,小于MinPts=3);
点m从点p直接密度可达,因为m在p的E领域内,并且p为核心对象;
点q从点p密度可达,因为点q从点m直接密度可达,并且点m从点p直接密度可达;
点q到点s密度相连,因为点q从点p密度可达,并且s从点p密度可达。
DBSCAN算法描述:
输入: 包含n个对象的数据库,半径e,最少数目MinPts;
输出:所有生成的簇,达到密度要求。
(1)Repeat
(2)从数据库中抽出一个未处理的点;
(3)IF抽出的点是核心点 THEN 找出所有从该点密度可达的对象,形成一个簇;
(4)ELSE 抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;
(5)UNTIL 所有的点都被处理。
DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。

好处

1. 与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。
2. 与K-means方法相比,DBSCAN可以发现任意形状的簇类。
3. 同时,DBSCAN能够识别出噪声点。
4.DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动。

缺点

1. DBScan不能很好反映高维数据。
2. DBScan不能很好反映数据集以变化的密度。
代码
# coding=utf-8from numpy import *
import matplotlib.pyplot as pltfrom matplotlib.pyplot import *
from collections import defaultdict
import randomclass DbScan(object):def show(self,data,color=None):if not color:color='green'group=self.createDataSet()fig = plt.figure(1)axes = fig.add_subplot(111)axes.scatter(group[:, 0], group[:, 1], s=40, c='red')axes.scatter(data[:, 0], data[:, 1], s=50, c=color)plt.show()def createDataSet(self):group = [[1.0, 1.1], [1.0, 1.0],[0, 0], [0, 0.1],[2, 1.0], [2.1, 0.9],[0.3, 0.0], [1.1, 0.9],[2.2, 1.0], [2.1, 0.8],[3.3, 3.5], [2.1, 0.9],[2, 1.0], [2.1, 0.9],[3.5, 3.4], [3.6, 3.5]]return groupdef dist(self,p1, p2):return ((p1[0]-p2[0])**2+ (p1[1]-p2[1])**2)**(0.5)def db_scan(self):all_points = self.createDataSet()E = 0.3minPts = 2# find out the core pointsother_points = []core_points = []  # 核心点集合plotted_points = []  # 使用到的点   非噪声点for point in all_points:point.append(0)  # 在点的后面加上第三维度类别,初始类别为 0total = 0for otherPoint in all_points:distance = self.dist(otherPoint, point)  # 遍历其他点并计算距离if distance <= E:total += 1  # 计算当前点的e领域内点的个数if total > minPts:core_points.append(point)  # 是核心点,添加到列表coreplotted_points.append(point)  # 将核心点添加到列表 plottedelse:other_points.append(point)  # 不是核心点,添加到其他点# find border pointsborder_points = []for core in core_points:  # 遍历核心点for other in other_points:  # 遍历非核心点if self.dist(core, other) <= E:border_points.append(other)  # 添加到非噪声点集合plotted_points.append(other)  # 添加到非噪声点集合# implement the algorithmcluster_label = 0for point in core_points:  # 遍历核心点if point[2] == 0:  # 核心点所属类别为0cluster_label += 1point[2] = cluster_label  # 每遍历一个核心点,类别栏就加1for point2 in plotted_points:  # 遍历非噪声点distance = self.dist(point2, point)if point2[2] == 0 and distance <= E:  # 非噪声点的类别为0 并且与核心点的距离小于epoint2[2] = point[2]  # 将核心点的类别赋值给非噪声点# print point, point2# after the points are asssigned correnponding labels, we group themcluster_list = defaultdict(lambda: [[], []])  # 定义一个字典,默认值是包含两个列表的列表for point in plotted_points:cluster_list[point[2]][0].append(point[0])  # 类别为键,值得第一个列表是非噪声点的xcluster_list[point[2]][1].append(point[1])  # 类别为键,值得第一个列表是非噪声点的ymarkers = ['+', '*', '.', 'd', '^', 'v', '>', '<', 'p']## plotting the clustersi = 0print cluster_listfor value in cluster_list:cluster = cluster_list[value]plot(cluster[0], cluster[1], markers[i])i = i % 10 + 1# plot the noise points as wellnoise_points = []for point in all_points:if not point in core_points and not point in border_points:noise_points.append(point)noisex = []noisey = []for point in noise_points:noisex.append(point[0])noisey.append(point[1])plot(noisex, noisey, "x")# /## title(str(len(cluster_list)) + " clusters created with E =" + str(E) + " Min Points=" + str(#     minPts) + " total points=" + str(len(all_points)) + " noise Points = " + str(len(noise_points)))axis((-1, 5, -1, 5))show()def start(self):self.db_scan()p=DbScan()
p.start()

  dbscan 在2维上效果要优于kmeans,不过各有利弊,一个是靠数据密度做输入,一个是靠分类类别做输入

转载于:https://www.cnblogs.com/greadlovejm/p/6090163.html

基于密度的聚类算法:DBSCAN相关推荐

  1. 机器学习-无监督学习-聚类:聚类方法(二)--- 基于密度的聚类算法【DBSCAN文本聚类算法,密度最大值文本聚类算法】

    密度聚类方法的指导思想是,只要样本点的密度大于某阀值,则将该样本添加到最近的簇中. 基于密度的聚类算法假设聚类结构能够通过样本分布的紧密程度确定,以数据集在空间分布上的稠密程度为依据进行聚类,即只要一 ...

  2. 基于密度的聚类算法(1)——DBSCAN详解

    基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DBSCAN简介 DBSCAN(Density-Based S ...

  3. 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( K-Means 方法缺陷 | 基于密度聚类原理及概念 | ε-邻域 | 核心对象 | 直接密度可达 | 密度可达 | 密度连接 )

    文章目录 I . K-Means 算法在实际应用中的缺陷 II . K-Means 初始中心点选择不恰当 III . K-Means 优点 与 弊端 IV . 基于密度的聚类方法 V . 基于密度的聚 ...

  4. 基于密度的聚类算法(3)——DPC详解

    基于密度的聚类算法(1)--DBSCAN详解 基于密度的聚类算法(2)--OPTICS详解 基于密度的聚类算法(3)--DPC详解 1. DPC简介 2014年,一种新的基于密度的聚类算法被提出,且其 ...

  5. 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( DBSCAN 原理 | DBSCAN 流程 | 可变密度问题 | 链条现象 | OPTICS 算法引入 | 聚类层次 | 族序概念 )

    文章目录 I . DBSCAN 简介 II . DBSCAN 算法流程 III . DBSCAN 算法 优缺点 IV . 可变密度问题 V . 链条现象 VI . OPTICS 算法原理 VII . ...

  6. matlab编程实现基于密度的聚类(DBSCAN)

    1. DBSCAN聚类的基本原理 详细原理可以参考链接: https://www.cnblogs.com/pinard/p/6208966.html 这是找到的相对很详细的介绍了,此链接基本仍是周志华 ...

  7. 聚类(中)层次聚类 基于密度的聚类算法

    简单用k-mean处理iris 数据集 import pandas as pd from sklearn.cluster import KMeans from sklearn.metrics impo ...

  8. DBSCAN聚类︱scikit-learn中一种基于密度的聚类方式

    文章目录 @[toc] 一.DBSCAN聚类概述 1.伪代码 2.优点: 3.缺点: 4.与其他聚类算法比较 二.sklearn中的DBSCAN聚类算法 1.主要函数介绍: 最重要的两个参数: 其他主 ...

  9. 【数据挖掘】聚类算法 简介 ( 基于划分的聚类方法 | 基于层次的聚类方法 | 基于密度的聚类方法 | 基于方格的聚类方法 | 基于模型的聚类方法 )

    文章目录 I . 聚类主要算法 II . 基于划分的聚类方法 III . 基于层次的聚类方法 IV . 聚合层次聚类 图示 V . 划分层次聚类 图示 VI . 基于层次的聚类方法 切割点选取 VII ...

最新文章

  1. 【剑道之道】亦是生存之道
  2. 口腔取模过程及注意事项_数字化口 腔的发展与展望
  3. vacantcell缓存分析
  4. Xshell 连接本地的Linux 系统,提示:Could not connect to '192.168.182.128' (port 23): Connection failed
  5. 1777:文件结构“图”
  6. c#问题(按F1或F2键时触发事件)
  7. php.exe占用资源过大,记录一次php占用系统资源过高的问题
  8. Java中找出s字符串的回文_给定一个字符串 s,找到 s 中最长的回文子串。
  9. 拓端tecdat|Stata中的治疗效果:RA:回归调整、 IPW:逆概率加权、 IPWRA、 AIPW
  10. matlab描点写函数,matlab描点并标上点的序号
  11. 使用miniSipServer为中小企业搭建VOIP服务器
  12. 佛说爱情二:前生500次的回眸才换得今生的一次擦肩而过
  13. Go 1.19 发行说明(翻译)
  14. 计算机属性高级是灰色的,Win10文件夹属性隐藏选项为灰色不可勾选怎么办?
  15. 计算机更名无法登陆用友u8,用友T6软件修改了计算机名称后,系统管理提示不能连接服务器-用友T6...
  16. Django 之ORM(一)
  17. 【关系网络】Learning to Compare: Relation Network for Few-Shot Learning
  18. php交易商城项目源代码,PHP源码交易商城网站整站源码(商业运行版)
  19. android adb没反应,Android adb无法发现设备处理方法
  20. 利用python脚本自动发布服务之arcmap篇

热门文章

  1. Hi3516DV300开发板——3.烧录过程问题、uboot相关设置及移植前准备
  2. vim终极编辑器配置
  3. 同余概述(同余定理)
  4. 锁存器原理/门电路/寄存器
  5. 什么是Ubuntu PPA以及为什么要用它[技术说明]
  6. Windows系统切换工具 算法分析+注册机
  7. 【NOIP2018】差点退役记
  8. 洪宗勝博士的教育翻轉大夢:用香蕉派翻转世界
  9. java使用mybatis拦截器对数据库敏感字段进行加密存储并解密
  10. 变电站文档数字化管理