DBSCAN sklearn 内存问题

Posted

技术标签:

【中文标题】DBSCAN sklearn 内存问题【英文标题】:DBSCAN sklearn memory issues 【发布时间】:2017-01-13 10:27:28 【问题描述】:

我正在尝试使用 DBSCAN sklearn 实现进行异常检测。它适用于小型数据集(500 x 6)。但是,当我尝试使用大型数据集(180000 x 24)时,它会遇到内存问题。有什么办法可以解决这个问题吗?

from sklearn.cluster import DBSCAN
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np

data = pd.read_csv("dataset.csv")
# Drop non-continuous variables
data.drop(["x1", "x2"], axis = 1, inplace = True)
df = data

data = df.as_matrix().astype("float32", copy = False)

stscaler = StandardScaler().fit(data)
data = stscaler.transform(data)

print "Dataset size:", df.shape

dbsc = DBSCAN(eps = 3, min_samples = 30).fit(data)

labels = dbsc.labels_
core_samples = np.zeros_like(labels, dtype = bool)
core_samples[dbsc.core_sample_indices_] = True

# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

print('Estimated number of clusters: %d' % n_clusters_)

df['Labels'] = labels.tolist()

#print df.head(10)

print "Number of anomalies:", -1 * (df[df.Labels < 0]['Labels'].sum())

【问题讨论】:

scikit-learn DBSCAN memory usage的可能重复 不幸的是,sklearn 实现是最坏情况 O(n^2)(这不是标准 DBSCAN,而是由于 sklearn 的矢量化;例如 ELKI 仅使用 O(n ) 记忆)。您可以使用低内存实现,添加更多内存,然后尝试使用更小的 eps。标准化数据上的 3 看起来太大了! 好的。让我尝试不同的参数。感谢您的回复。我希望在我尝试 ELKI 或 R 之前有一些有效的 python 实现。 我将参数更改为: dbsc = DBSCAN(eps = 1, min_samples = 15).fit(data) 它需要 10GB 内存和 25 分钟,但工作正常。再次感谢。 【参考方案1】:

根据您要解决的问题类型,可以在 DBSCAN 构造函数中使用此参数:

leaf_size:整数,可选(默认 = 30) 叶子大小传递给 BallTree 或 cKDTree。这会影响构建和查询的速度,以及存储树所需的内存。最佳值取决于问题的性质。

如果这不符合您的需求,这个问题已经解决here,您可以尝试使用 ELKI 的 DBSCAN 实现。

【讨论】:

谢谢。我确实看到了另一个堆栈溢出问题,但希望该问题在最新的 scikit learn 中得到解决。 leaf_size 可能对内存成本影响不大。 sklearn 问题是因为它首先计算并存储所有点的所有邻居,然后运行 ​​DBSCAN。这就是为什么大的 eps 是有问题的。 ELKI 需要改进文档。

以上是关于DBSCAN sklearn 内存问题的主要内容,如果未能解决你的问题,请参考以下文章

DBSCAN 处理大数据崩溃和内存错误 [重复]

sklearn 的标准 DBSCAN 怎么跑得这么快?

sklearn DBSCAN用大epsilon聚类GPS位置

如何在 DBSCAN sklearn 中获取质心?

用sklearn对弧度距离矩阵进行DBSCAN?

在 python 中的 sklearn 中绘制 DBSCAN 中的特定点