DBSCAN 集群甚至无法处理 40k 数据,但使用 python 和 sklearn 处理 10k 数据

Posted

技术标签:

【中文标题】DBSCAN 集群甚至无法处理 40k 数据,但使用 python 和 sklearn 处理 10k 数据【英文标题】:DBSCAN clustering is not working even on 40k data but working on 10k data using python and sklearn 【发布时间】:2020-10-16 19:07:03 【问题描述】:

我正在尝试对我的数据集进行聚类。我的数据集中有 700k 行。我从中拿了 40k 并尝试在 python 和 sklearn 中进行 DBSCAN 聚类。我在 32 GB 内存上运行。该算法运行了一整夜,但没有完成,我随后手动停止了程序。

但是当我尝试使用 10k 数据集时,它正在运行。

DBSCAN 对数据集大小有什么限制吗?

我使用了以下代码:

clustering = DBSCAN().fit(df)
pred_y = clustering.labels_

还有以下版本:

clustering = DBSCAN(eps=9.7, min_samples=2, algorithm='ball_tree', metric='minkowski', leaf_size=90, p=2).fit(df)
pred_y = clustering.labels_

如何在我的数据集中使用 DBSCAN 聚类?

【问题讨论】:

【参考方案1】:

[更新]

我们在这里讨论了多少列?根据我使用 DBSCAN 的经验,列数对性能的影响大于行数。我倾向于在将数据拟合到 DBSCAN 之前使用 PCA 来降低维度 - 这会显着加快聚类过程。

根据您提供的其他信息,我做了一个简单的复制(警告!使用当前参数,它将运行很长时间):

import numpy as np

data_1k = np.random.random((1000, 4))
data_5k = np.random.random((5000, 4))
data_10k = np.random.random((10000, 4))
data_40k = np.random.random((40000, 4))

from sklearn.cluster import DBSCAN

clustering = DBSCAN(eps=9.7, min_samples=2, algorithm='ball_tree', metric='minkowski', leaf_size=90, p=2).fit(data_40k)
np.unique(clustering.labels_)

对于 10k 数据集,上述代码将在几秒钟内执行,但对于 40k 数据集,它将处理它超长的时间,这是由 eps 参数的非常高的值引起的。您确定它是您数据的“正确”值吗? 对于我上面提供的示例,只需降低 eps 值(例如降低到 0.08)即可将过程加速到大约 3 秒。

如果eps=9.7 确实是您的数据所需的值,我会考虑使用一些缩放器或可能有助于缩小值范围的东西? (并降低eps 值)

【讨论】:

我只有 4 列,数据类型是浮点数 @BCSmith 检查,我更新的答案。我添加了一个简单的复制并在那里给出了更多解释。请看看这是否有意义 我用默认的 eps 测试了 40k 数据并且它运​​行了。但是当我将大小增加到 80k 时,它会显示内存错误。我有 32 GB 的内存。如何用这么大的数据进行聚类?

以上是关于DBSCAN 集群甚至无法处理 40k 数据,但使用 python 和 sklearn 处理 10k 数据的主要内容,如果未能解决你的问题,请参考以下文章

具有 metric='russellrao' 的 DBSCAN 集群

集群分配有时在两个 DBSCAN 实现中不同

Python DBSCAN - 如何根据向量的平均值绘制集群?

使用 sklearn DBSCAN 模型对新条目进行分类

dbscan - 设置最大集群跨度限制

Scikit DBSCAN eps 和 min_sample 值确定