DBSCAN#
- sklearn.cluster.dbscan(X, eps=0.5, *, min_samples=5, metric='minkowski', metric_params=None, algorithm='auto', leaf_size=30, p=2, sample_weight=None, n_jobs=None)[source]#
基于向量数组或距离矩阵执行DBSCAN聚类。
在用户指南中了解更多信息。
- 参数:
- X形状为 (n_samples, n_features) 或 (n_samples, n_samples) 的 {array-like, sparse (CSR) matrix}
特征数组,如果
metric='precomputed'
,则为样本间距离数组。- eps浮点数,默认为 0.5
两个样本之间被认为在彼此邻域内的最大距离。这不是集群内点距离的最大界限。这是最重要的DBSCAN参数,需要根据您的数据集和距离函数进行适当选择。
- min_samples整数,默认为 5
一个点被认为是核心点的邻域中的样本数(或总权重)。这包括点本身。
- metric字符串或可调用对象,默认为 'minkowski'
计算特征数组中实例之间距离时使用的度量。如果metric是字符串或可调用对象,它必须是
sklearn.metrics.pairwise_distances
的metric参数允许的选项之一。如果metric为“precomputed”,则假设X为距离矩阵,并且在拟合过程中必须为方阵。X可以是稀疏图,在这种情况下,只有“非零”元素可能被认为是邻居。- metric_params字典,默认为 None
度量函数的其他关键字参数。
版本 0.19 中新增。
- algorithm{'auto', 'ball_tree', 'kd_tree', 'brute'},默认为 'auto'
NearestNeighbors 模块用于计算逐点距离和查找最近邻居的算法。详情请参见 NearestNeighbors 模块文档。
- leaf_size整数,默认为 30
传递给 BallTree 或 cKDTree 的叶子大小。这会影响构建和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。
- p浮点数,默认为 2
用于计算点之间距离的 Minkowski 度量的幂。
- sample_weight形状为 (n_samples,) 的 array-like,默认为 None
每个样本的权重,使得至少具有
min_samples
权重的样本本身就是一个核心样本;具有负权重的样本可能会阻止其 eps-邻居成为核心。请注意,权重是绝对的,默认为 1。- n_jobs整数,默认为 None
为邻居搜索运行的并行作业数。
None
表示 1,除非在joblib.parallel_backend
上下文中。-1
表示使用所有处理器。更多详情请参见词汇表。如果使用预计算距离,则并行执行不可用,因此 n_jobs 将不起作用。
- 返回:
- core_samples形状为 (n_core_samples,) 的 ndarray
核心样本的索引。
- labels形状为 (n_samples,) 的 ndarray
每个点的聚类标签。噪声样本的标签为 -1。
备注
例如,请参见 DBSCAN 聚类算法演示。
此实现批量计算所有邻域查询,这将内存复杂度增加到 O(n.d),其中 d 是平均邻居数,而原始 DBSCAN 的内存复杂度为 O(n)。根据
algorithm
,查询这些最近邻域时,它可能会导致更高的内存复杂度。避免查询复杂度的一种方法是使用
NearestNeighbors.radius_neighbors_graph
和mode='distance'
分块预计算稀疏邻域,然后在此处使用metric='precomputed'
。另一种减少内存和计算时间的方法是删除(近)重复点并使用
sample_weight
。OPTICS
提供了具有较低内存使用率的类似聚类。参考文献
Ester, M., H. P. Kriegel, J. Sander, and X. Xu, “一种用于发现大型空间数据库中具有噪声的聚类的基于密度的算法”。在:第二届知识发现和数据挖掘国际会议论文集,俄勒冈州波特兰市,AAAI出版社,第226-231页。1996年
Schubert, E., Sander, J., Ester, M., Kriegel, H. P., & Xu, X. (2017)。“DBSCAN 再回顾,再回顾:为什么以及如何(仍然)使用 DBSCAN。”ACM 数据库系统事务 (TODS), 42(3), 19。
示例
>>> from sklearn.cluster import dbscan >>> X = [[1, 2], [2, 2], [2, 3], [8, 7], [8, 8], [25, 80]] >>> core_samples, labels = dbscan(X, eps=3, min_samples=2) >>> core_samples array([0, 1, 2, 3, 4]) >>> labels array([ 0, 0, 0, 1, 1, -1])