我用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)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐