0
我正在用DBSCAN对数据进行聚类以删除异常值。计算非常耗费内存,因为scikit-learn中的DBSCAN的实现不能处理将近1 GB的数据。问题已经提到here使用DBSCAN(大矩阵计算)进行聚类时的内存错误
下面的代码的瓶颈似乎是矩阵计算,这是非常耗费内存(矩阵的大小: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)
的可能的复制[scikit学习DBSCAN存储器用途](https://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage) –