DBSCAN 是基于密度聚类的算法

特点:

1、无需指定簇的个数
2、生成的簇数不确定
3、对非凸数据集聚类效果不错

核心思想:

DBSCAN算法将数据点分为三类:
  1.核心点:在半径Eps内含有超过MinPts数目的点。
  2.边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内的点。
  3.噪音点:既不是核心点也不是边界点的点。
  如下图所示,Eps=5, MinPts=5

算法流程:

1.将所有点标记为核心点、边界点或噪声点;
2.删除噪声点;
3.每组连通的核心点形成一个簇;
4.将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半径范围之内)。

举例




代码示例

使用scikit-learn中的sklearn.cluster.DBSCAN类。其参数包括:
1)eps: DBSCAN算法参数,即我们的ϵ-邻域的距离阈值,和样本距离超过ϵ的样本点不在ϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。
2)min_samples: DBSCAN算法参数,即样本点要成为核心对象所需要的ϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。
3)metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)
4)algorithm:最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。这三种方法在K近邻法(KNN)原理小结中都有讲述,如果不熟悉可以去复习下。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。
5)leaf_size:最近邻搜索算法参数,为使用KD树或者球树时, 停止建子树的叶子节点数量的阈值。这个值越小,则生成的KD树或者球树就越大,层数越深,建树时间越长,反之,则生成的KD树或者球树会小,层数较浅,建树时间较短。默认是30. 因为这个值一般只影响算法的运行速度和使用内存大小,因此一般情况下可以不管它。
6) p: 最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。
以上就是DBSCAN类的主要参数介绍,其实需要调参的就是两个参数eps和min_samples,这两个值的组合对最终的聚类效果有很大的影响。

凸数据集聚类

from sklearn.cluster import DBSCAN,KMeans
import numpy as np
import matplotlib.pyplot as plt
#datatype1:
data=np.array([[1,2,2,4,5,6,6,7,9, 1, 3, 5,3],[2,1,4,3,8,7,9,9,5,12,12,12,3]])
data=data.T
plt.figure(1)
plt.scatter(data[:,0],data[:,1])#Kmeans
y_pred=KMeans(n_clusters=4,random_state=9).fit_predict(data)
print('KMeans:',y_pred)
plt.figure(2)
plt.scatter(data[:,0],data[:,1],c=y_pred)#DBSCAN
y_pred=DBSCAN(eps=3,min_samples=3).fit_predict(data)
print('DBSCAN:',y_pred)
plt.figure(3)
plt.scatter(data[:,0],data[:,1],c=y_pred)
plt.show()



从上可看到示例Kmeans、DBSCAN分类结果一致,不过标签存在区别,DBSCAN中标签-1表示噪点,大于0的值为簇类。

非凸数据集聚类

我们随机生成三组数据,其中两组非凸。然后分别使用KNN 和DBSCAN对数据聚合。
代码如下:

from sklearn.cluster import DBSCAN,KMeans
import numpy as np
import matplotlib.pyplot as plt
##datatype2
from sklearn import datasets
X1,y1=datasets.make_circles(n_samples=5000,factor=.6,noise=0.05)
X2,y2=datasets.make_blobs(n_samples=1000,n_features=2,centers=[[1.2,1.2]],cluster_std=[[.1]],random_state=9)
data=np.concatenate((X1,X2))
plt.figure(1)
plt.scatter(data[:,0],data[:,1])y_pred=KMeans(n_clusters=4,random_state=9).fit_predict(data)
print('KMeans:',y_pred)
plt.figure(2)
plt.scatter(data[:,0],data[:,1],c=y_pred)
y_pred=DBSCAN(eps=0.1,min_samples=40).fit_predict(data) ##default 0.5 5print('DBSCAN:',y_pred)
plt.figure(3)
plt.scatter(data[:,0],data[:,1],c=y_pred)
plt.show()

数据如下:

Kmeans对于非凸数据数据集效果不好,如下图:

对于DBSCAN,我们使用不同的参数,对比看下输出的结果:
eps=0.5,min_samples=10

eps=0.2,min_samples=10

eps=0.1,min_samples=10

eps=0.1,min_samples=40

可见eps调小,min_samples调大能促使更多的簇产生。同时min_samples调大能分割出更多的噪点。

参考:
https://www.cnblogs.com/pinard/p/6217852.html
https://www.cnblogs.com/bonelee/p/8692336.html

DBSCAN密度聚类示例深入理解相关推荐

  1. python机器学习库sklearn——DBSCAN密度聚类

    分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 DBSCAN密度聚类的相关 ...

  2. 聚类算法(3):DBSCAN密度聚类

    目录 1. 基本概念 2. 算法描述 3. 算法实例 4. 算法优缺点 DBSCAN(Density-Based Spatial Clustering of Application with Nois ...

  3. 人工智能——DBSCAN密度聚类(Python)

    目录 1 概述 1.1 概念 1.2 DBSCAN数据点分类 2 DBSCAN算法流程 2.1 DBSCAN算法流程: 2.2 举例 3 案例1(Python实现 ) 3.1 案例 3.2 Pytho ...

  4. DBSCAN密度聚类

    DBSCAN算法是一种基于密度的聚类算法: 聚类的时候不需要预先指定簇的个数 最终的簇的个数不定 DBSCAN算法将数据点分为三类: 核心点:在半径Eps内含有超过MinPts数目的点 边界点:在半径 ...

  5. (十八)密度聚类DBSCAN

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

  6. 密度聚类之DBSCAN算法原理

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

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

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

  8. 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解

    注: 两整天的成果,谬误之处勿喷 1 聚类概述 样本 没有训练的样本 没有标注的样本 1.1 相似度度量 1.1.1 距离相似度度量 距离度量 dist(oi,oj)dist(o_{i},o_{j}) ...

  9. dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)

    # 密度聚类DBSCAN.HDBSCAN DBSCAN DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声 ...

最新文章

  1. c语言随机延迟5-10秒,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
  2. UI设计实用素材|iPhone样机模型(展示你的应用程序、网站或用户界面的完美方式。
  3. 华住数据库_华住内控人系列故事(四)技术领先篇——搭建大数据风险数据仓,实现自助取数...
  4. 基于结构的虚拟筛选模型 gnina 从源码编译
  5. 页面自动刷新代码大全
  6. 关于linux下的iptables 的浅析命令和了解
  7. Paypal 在线支付接口应用从零开始,第1节,[建立沙盒测试环境]
  8. hashmap value占用空间大小_性能优化:为什么要使用SparseArray和ArrayMap替代HashMap?...
  9. 百度地图API地理位置和坐标转换 城市坐标
  10. 计算机播放qq音乐没声音怎么办,电脑突然没声音了.开启QQ音乐说要检查音效卡驱动程式设定是否正常....
  11. 【饭谈】软件测试薪资层次和分段(修仙)
  12. 打印驱动的安装和卸载
  13. glassfish插件_安装和使用Glassfish
  14. 游戏本自动掉帧_玩游戏掉帧怎么办?
  15. Python3教程@hikali
  16. 二层交换与MAC地址
  17. #常用传感器讲解十二--倾斜开关传感器(KY-020)
  18. 软工实践第三次作业-结对项目1
  19. JavaScript开发技巧
  20. nb-lot plc python_基于NB-LOT实现.....

热门文章

  1. 差分信号、共模信号、单端信号异同 (2022.2.14)
  2. 矩阵论 - 5 - 转置、置换、向量空间
  3. c语言数据结构之队列
  4. matlab中图像分割技术之二阈值分割
  5. 03.OpenWrt-系统固件烧录
  6. 2022年4月27日 复盘计划
  7. Proxycap对打印的影响
  8. tomcat解压war包的一点例外
  9. lua java 加密解密_AES加解密多版本(GO、JAVA、Python)实现
  10. R346型多通道大功率高频读写器