DBSCAN聚类算法

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

1.基本概念

  • 核心对象:若某个点的密度达到算法设定的阈值则其为核心点。(即r邻域内点的数量不小于minPts )。其中minPts是自己设定的点的个数,即以r为圆心的圆包含的点多余minPts,那么它就是一个核心对象
  • ε-邻域的距离阈值∶设定的半径ε。
  • 直接密度可达︰若某点p在点q的ε 邻域内,且q是核心点则p->q直接密度可达。可以理解为p在核心点q的圆内。
  • 密度可达∶若有一个关于点的序列q0、q1、…qk,对任意qi->qi-1是直接密度可达的,则称从q0到qk密度可达,这实际上是直接密度可达的“传播”。
  • 边界点:属于某一个类的非核心点,即它的邻域内的点少于minPts。
  • 噪声点:不属于任何一个类簇的点,即任何一个核心点都不包括这个点,从任何一个核心点到这个点都是密度不可达的。

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

可用于异常点的检测。

2.参数选择

半径r:找突变点

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 calDist(a,b):a = np.array(a)b = np.array(b)dist = np.sqrt(np.dot((a-b),(a-b).T))return dist

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

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

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

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

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

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

8.设置参数

# 设置参数
minPts = 3
epsilon = 1.0

9.算法实现

'''
DBSCAN算法
'''
def DBSCAN(epsilon,minPts,data):all_clusters = [] # 所有簇noiseList = []selected = [0 for i in range(len(data))]while getUnvisited(selected) != -1:C = [] # 保存同一个簇的点i = getUnvisited(selected) # 找未选择点selected[i] = 1 # 修改选择状态p = data[i]cnts,neibors = findNeibors(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)] = -1q_cnt,q_neibors = findNeibors(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 isInClusters(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()

【机器学习】DBSCAN聚类算法相关推荐

  1. 【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现

    [机器学习]聚类算法DBSCAN.K-means.Mean Shift对比分析及具体代码实现 一.DBSCAN算法(具有噪声的基于密度的聚类方法) 1.算法原理 基于数据分布密度不同对数据进行聚类,把 ...

  2. dbscan算法_如何掌握用于机器学习的流行DBSCAN聚类算法

    总览 DBSCAN聚类是一种针对无监督学习问题而被低估但非常有用的聚类算法 了解DBSCAN集群如何工作,为什么要学习以及如何在Python中实现DBSCAN集群 介绍 掌握无监督学习为数据科学家开辟 ...

  3. DBSCAN聚类算法——机器学习(理论+图解+python代码)

    一.前言 二.DBSCAN聚类算法 三.参数选择 四.DBSCAN算法迭代可视化展示 五.常用的评估方法:轮廓系数 六.用Python实现DBSCAN聚类算法 一.前言 去年学聚类算法的R语言的时候, ...

  4. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. 机器学习之聚类算法——聚类效果评估可视化

    我曾在机器学习之聚类算法应用篇中介绍过,聚类算法常使用轮廓系数来评估聚类效果,不过有时候并不是轮廓系数越大越好,如下面两幅图所示,图中的红色虚线表示聚类系数分数: 显然将簇数据设置为2的时候得到的轮廓 ...

  6. K-means与DBSCAN聚类算法

    K-means与DBSCAN聚类算法 前言:目前数据聚类方法大体上可以分为划分式聚类方法(Partition-based Methods).基于密度的聚类方法(Density-based method ...

  7. python DBSCAN聚类算法

    文章目录 DBSCAN聚类算法 基本思想 基本概念 工作流程 参数选择 DBSCAN的优劣势 代码分析 ==Matplotlib Pyplot== ==make_blobs== ==StandardS ...

  8. dbscan算法c语言实现,用C++实现DBSCAN聚类算法

    这几天由于工作需要,对DBSCAN聚类算法进行了C++的实现.时间复杂度O(n^2),主要花在算每个点领域内的点上.算法很简单,现共享大家参考,也希望有更多交流. 数据点类型描述如下: 复制代码 代码 ...

  9. dbscan聚类算法_一种视频人群流的轨迹聚类方法

    tags: KLT光流法,K-means聚类算法,DBSCAN聚类算法 方法简介 运动轨迹是一种在视频场景中捕捉复杂时间动态的有效方法.因此,我们将人流分割问题转化为一个轨迹提取和聚类任务.该方法分为 ...

  10. DBSCAN聚类算法原理及图解

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...

最新文章

  1. 最大的ai计算机模型,Microsoft构建了世界排名前五的超级计算机,用于在Azure上训练大型AI模型...
  2. 【Binder 机制】进程通信 | 用户空间与内核空间 | MMU 与虚拟内存地址
  3. 004_Ajax服务器响应
  4. JavaScript快速入门-ECMAScript本地对象(RexExp)
  5. 永不示弱_永不过时的网页设计:今天和2000年的在线投资组合
  6. iNeuOS工业互联网操作系统,矿山动态产量计量系统和铁路车辆识别系统应用场景案例...
  7. python matplotlib包图像配色方案
  8. 考个ISTQB证书有用吗
  9. CVPR-2020 AAAI2020 CVPR-2019 NIPS-2019 ICCV-2019 IJCAI-2019 论文超级大合集下载,整理好累,拿走不谢
  10. 用微软的云计算来远程管理自己的电脑
  11. USB转串口驱动分析(一)
  12. 华为完成首个5G测试;央行搭建区块链平台;苹果将于今夜凌晨举行发布会;蔚来汽车明日在美上市; | 雷锋网9月12日消息...
  13. 4月22日丨【云数据库技术沙龙】技术进化,让数据更智能
  14. Linux下安装anaconda
  15. 服务器虚拟化巡检报告,vmvare虚拟化平台巡检周报
  16. 小i机器人2019数博会C位展实力 “认知智能”引领行业创新变革
  17. access连接机床_机床如何使用四大系统实现网络化管理
  18. N圆最密堆积、最小外接正方形的matlab求解(二维、三维等圆Packing 问题)
  19. 计算机公式ref是什么意思,Excel公式应用错误提示“#REF!”怎么处理
  20. 耐腐蚀INCONEL 625 合金性能是多少

热门文章

  1. 开发者需要什么样的技术社区?
  2. python查看qq撤回消息_QQ坦白说里匿名叫我还想逃?Python轻松查看匿名用户信息...
  3. 2021电赛备赛(一):2015国赛H题风力摆
  4. uniapp点击复制文本
  5. c语言usb串口通信程序,C语言在RS232串行接口通信中的实现
  6. ESP8266自动下载电路分析
  7. 索爱小蜜蜂扩音器怎么样啊~
  8. html点击下载图片
  9. 一种低成本动态扩展 Java API 的解决方案 - Ricequant米筐量化
  10. 从智能家居的发展看对讲企业的定位