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 内存问题的主要内容,如果未能解决你的问题,请参考以下文章