2017-04-18 23 views
0

我正在用DBSCAN对数据进行聚类以删除异常值。计算非常耗费内存,因为scikit-learn中的DBSCAN的实现不能处理将近1 GB的数据。问题已经提到here使用DBSCAN(大矩阵计算)进行聚类时的内存错误

下面的代码的瓶颈似乎是矩阵计算,这是非常耗费内存(矩阵的大小: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) 
+0

的可能的复制[scikit学习DBSCAN存储器用途](https://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage) –

回答

0

1至3将不起作用。

  1. 您的数据是密集的。没有“大多为0”,所以稀疏格式实际上需要更多内存。确切的阈值有所不同,但根据经验法则,稀疏格式至少需要90%的零才能生效。

  2. DBSCAN不使用距离矩阵。

  3. 在零件上工作,然后合并并不那么容易(有GriDBSCAN,这对于欧几里得而言是这样做的)。您不能随意分割并稍后合并它们。