【发布时间】:2017-06-24 04:45:03
【问题描述】:
我正在使用 DBSCAN 对数据进行聚类以消除异常值。计算非常消耗内存,因为 scikit-learn 中的 DBSCAN 实现无法处理近 1 GB 的数据。问题已经提到here
以下代码的瓶颈似乎是矩阵计算,它非常消耗内存(矩阵大小:10mln x 10mln)。有没有办法优化 DBSCAN 的计算?
我的简短研究表明,应该以某种方式将矩阵简化为稀疏矩阵,以使其易于计算。
我的想法如何解决这个问题:
- 创建并计算稀疏矩阵
- 计算部分矩阵并将它们保存到文件中并稍后合并它们
- 对小数据子集执行 DBSCAN 并合并结果
- 切换到 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