公众号:尤而小屋
编辑:Peter
作者:Peter
大家好,我是Peter~
今天给大家介绍基于密度的聚类算法DBSCAN,包含:
- DBSCAN算法定义
- sklearn.cluster.DBSCAN参数详解
- DBSCAN聚类实战
- DBSCAN聚类效果评估
- DBSCAN聚类可视化
- DBSCAN算法优缺点总结
https://scikit-learn.org/stable/auto_examples/cluster/plot_cluster_comparison.html#sphx-glr-auto-examples-cluster-plot-cluster-comparison-py
1 DBSCAN定义
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,基于密度的带有噪声的空间聚类应用)是一种基于密度的聚类算法。
密度聚类算法一般假定类别是可以通过样本分布的紧密程度来决定。同一个类别中,样本之间是紧密相连的,也就说通过将紧密相连的样本划分为一类,这样就生成了一个聚类类别。
关于DBSCAN到底是如何实现聚类的?
一个关键点:DBSCAN是基于一组邻域来描述样本集的紧密程度,参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts)用来描述邻域的样本紧密程度。其中 ϵ \epsilon ϵ描述邻域半径,表示两个样本被视为相邻的最大距离;MinPts表示某一样本的距离为 ϵ \epsilon ϵ的邻域中样本个数的阈值。
DBSCAN的全称是Density-Based Spatial Clustering of Applications with Noise,中文意为“基于密度的带有噪声的空间聚类应用”。它能够通过样本点的密集区域识别出各个聚类簇,并且对噪声点具有很强的鲁棒性。以下是关于DBSCAN的相关介绍:
- 核心思想:DBSCAN的核心在于基于样本点的密度进行聚类,即通过找出样本空间中密集的区域来进行簇的划分。
- 算法参数:DBSCAN需要两个主要参数:邻域半径和最少点数目。只有当某点在其邻域内的点数大于或等于最少点数目时,该点才被视为核心点。
- 点类别:DBSCAN中的点分为三类:核心点、边界点和噪声点。核心点是指那些在邻域内具有足够多的点的对象,边界点则是那些邻近核心点但自身不是核心点的点,而噪声点则既不是核心点也不是边界点
- 点关系:DBSCAN中的点关系包括密度直达、密度可达和密度相连。这些关系定义了如何从一个核心点扩展至整个簇。
更多详细的定义请见:参考资料2
2 sklearn用法
2.1 参数
sklearn.cluster.DBSCAN的完整参数解释-参考资料1:
sklearn.cluster.DBSCAN(
eps=0.5, # 邻域半径;它表示两个样本被视为相邻的最大距离。较大的值会导致更多的簇,较小的值会导致更少的簇
*,
min_samples=5, # 形成簇所需的最小样本数
# euclidean-欧式距离;manhattan-曼哈顿距离;chebyshev-切比雪夫距离;minkowski-闵可夫斯基距离;
# wminkowski-带权重闵可夫斯基距离;seuclidean-标准化欧式距离;mahalanobis-马氏距离
metric='euclidean', # 计算样本之间距离的度量方法;
metric_params=None, # 度量方法的其他参数
algorithm='auto', # 用于计算最近邻的算法,默认'auto', ['auto'、'ball_tree'、'kd_tree'和'brute']
leaf_size=30, # 构建最近邻树时的叶子大小
p=None, # Minkowski距离的幂指数,默认值为None。当度量方法为'minkowski'时,该参数有效
n_jobs=None, # 并行计算的线程数,默认为None;若为-1,则使用所有可用的处理器
)
其中最主要的参数eps
(对应 ϵ \epsilon ϵ)和Min_samples
(对应 M i n P t s MinPts MinPts)
2.2 属性
- core_sample_indices:核心店的index
- components:核心点的原始数据信息
- lables:每个样本的类别label,noise的label是-1
3 案例1
3.1 模拟数据
In [1]:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import DBSCAN
from sklearn import metrics # 评估指标
import warnings
warnings.filterwarnings("ignore")
In [2]:
X = np.array([[1, 2],
[2, 2],
[2, 3],
[3, 5],
[9, 7],
[8, 9],
[45,