我用DBSCAN对数据进行聚类,以去除异常值。由于scikit learn中的DBSCAN实现无法处理几乎1gb的数据,因此计算非常消耗内存。这个问题已经提到了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)