【问题标题】:Memory Error during clustering with DBSCAN (large matrix computation)使用 DBSCAN(大型矩阵计算)进行聚类时出现内存错误
【发布时间】:2017-06-24 04:45:03
【问题描述】:

我正在使用 DBSCAN 对数据进行聚类以消除异常值。计算非常消耗内存,因为 scikit-learn 中的 DBSCAN 实现无法处理近 1 GB 的数据。问题已经提到here

以下代码的瓶颈似乎是矩阵计算,它非常消耗内存(矩阵大小:10mln x 10mln)。有没有办法优化 DBSCAN 的计算?

我的简短研究表明,应该以某种方式将矩阵简化为稀疏矩阵,以使其易于计算。

我的想法如何解决这个问题:

  1. 创建并计算稀疏矩阵
  2. 计算部分矩阵并将它们保存到文件中并稍后合并它们
  3. 对小数据子集执行 DBSCAN 并合并结果
  4. 切换到 Java 并使用 ELKI 工具

代码:

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

# sample data
speed = np.random.uniform(0,25,1000000)
power = np.random.uniform(0,3000,1000000)

# create a dataframe
data_dict = {'speed': speed,
            'power': power}

df = pd.DataFrame(data_dict)

# convert to matrix
df = df.as_matrix().astype("float64", copy = False)

X = data

# normalize data
X = StandardScaler().fit_transform(X)

# precompute matrix of distances
dist_matrix = sklearn.metrics.pairwise.euclidean_distances(X, X)

# perform DBSCAN clustering
db = DBSCAN(eps=0.1, min_samples=60, metric="precomputed", n_jobs=-1).fit(dist_matrix)

【问题讨论】:

标签: python out-of-memory sparse-matrix dbscan


【解决方案1】:

1 到 3 不起作用。

  1. 您的数据很密集。没有“大部分是 0”,因此稀疏格式实际上需要更多 更多 内存。确切的阈值各不相同,但根据经验,您需要至少 90% 的 0 才能使稀疏格式生效。

  2. DBSCAN 不使用距离矩阵。

  3. 在零件上工作,然后合并不是那么容易(有 GriDBSCAN,它为欧几里德拳头做这件事)。您不能只取随机分区并在以后合并它们。

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 2017-06-15
    • 1970-01-01
    • 2012-10-06
    • 2021-07-08
    • 2017-02-17
    • 2017-05-20
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多