2017-04-18 9 views
0

異常値を除去するためにDBSCANでデータをクラスタリングしています。 scikit-learnでのDBSCANの実装では、ほぼ1 GBのデータを処理できないため、計算は非常にメモリを消費します。問題は既に述べられていますhereDBSCANによるクラスタリング中のメモリエラー(大行列演算)

次のコードのボトルネックは、非常にメモリを消費します(行列のサイズ:10mln×10mln)。 DBSCANの計算を最適化する方法はありますか?

私の簡単な調査によれば、計算を実行可能にするために、マトリックスを何らかの方法で疎行列に減らす必要があることがわかりました。この問題を解決するための方法を

私のアイデア:

  1. スパース行列を作成し、計算行列の部分を計算し、ファイルに保存し、データの小さなサブセットにDBSCANを実行後に
  2. それらをマージそして、ELKIツールのJavaに結果に
  3. スイッチをマージし、使用

コード:

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-learn DBSCAN memory usage]の複製(https://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage) –

答えて

0

1から3は機能しません。

  1. データが密集しています。 「ほとんど0」はないので、実際には疎フォーマットには多くのメモリが必要です。moreメモリ正確なしきい値は異なりますが、一般的に、スパースフォーマットが有効になるには、0の90%以上が必要です。

  2. DBSCANは距離行列を使用しません。

  3. 部品を操作すると、マージが簡単ではありません(ユークリッドのためにこれを行うGriDBSCANがあります)。あなたはただランダムなパーティションを取って後でマージすることはできません。

関連する問題