DBSCAN密度聚类示例深入理解
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密度聚类示例深入理解相关推荐
- python机器学习库sklearn——DBSCAN密度聚类
分享一个朋友的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!大家可以看看是否对自己有帮助:点击打开 全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 DBSCAN密度聚类的相关 ...
- 聚类算法(3):DBSCAN密度聚类
目录 1. 基本概念 2. 算法描述 3. 算法实例 4. 算法优缺点 DBSCAN(Density-Based Spatial Clustering of Application with Nois ...
- 人工智能——DBSCAN密度聚类(Python)
目录 1 概述 1.1 概念 1.2 DBSCAN数据点分类 2 DBSCAN算法流程 2.1 DBSCAN算法流程: 2.2 举例 3 案例1(Python实现 ) 3.1 案例 3.2 Pytho ...
- DBSCAN密度聚类
DBSCAN算法是一种基于密度的聚类算法: 聚类的时候不需要预先指定簇的个数 最终的簇的个数不定 DBSCAN算法将数据点分为三类: 核心点:在半径Eps内含有超过MinPts数目的点 边界点:在半径 ...
- (十八)密度聚类DBSCAN
密度聚类DBSCAN DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法) 是一种很典型 ...
- 密度聚类之DBSCAN算法原理
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-M ...
- 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( K-Means 方法缺陷 | 基于密度聚类原理及概念 | ε-邻域 | 核心对象 | 直接密度可达 | 密度可达 | 密度连接 )
文章目录 I . K-Means 算法在实际应用中的缺陷 II . K-Means 初始中心点选择不恰当 III . K-Means 优点 与 弊端 IV . 基于密度的聚类方法 V . 基于密度的聚 ...
- 聚类算法_层次聚类_密度聚类(dbscan,meanshift)_划分聚类(Kmeans)详解
注: 两整天的成果,谬误之处勿喷 1 聚类概述 样本 没有训练的样本 没有标注的样本 1.1 相似度度量 1.1.1 距离相似度度量 距离度量 dist(oi,oj)dist(o_{i},o_{j}) ...
- dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)
# 密度聚类DBSCAN.HDBSCAN DBSCAN DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声 ...
最新文章
- c语言随机延迟5-10秒,linux下写个C语言程序,要求有0.5微秒以下的延时,要怎样写...
- UI设计实用素材|iPhone样机模型(展示你的应用程序、网站或用户界面的完美方式。
- 华住数据库_华住内控人系列故事(四)技术领先篇——搭建大数据风险数据仓,实现自助取数...
- 基于结构的虚拟筛选模型 gnina 从源码编译
- 页面自动刷新代码大全
- 关于linux下的iptables 的浅析命令和了解
- Paypal 在线支付接口应用从零开始,第1节,[建立沙盒测试环境]
- hashmap value占用空间大小_性能优化:为什么要使用SparseArray和ArrayMap替代HashMap?...
- 百度地图API地理位置和坐标转换 城市坐标
- 计算机播放qq音乐没声音怎么办,电脑突然没声音了.开启QQ音乐说要检查音效卡驱动程式设定是否正常....
- 【饭谈】软件测试薪资层次和分段(修仙)
- 打印驱动的安装和卸载
- glassfish插件_安装和使用Glassfish
- 游戏本自动掉帧_玩游戏掉帧怎么办?
- Python3教程@hikali
- 二层交换与MAC地址
- #常用传感器讲解十二--倾斜开关传感器(KY-020)
- 软工实践第三次作业-结对项目1
- JavaScript开发技巧
- nb-lot plc python_基于NB-LOT实现.....