異常値を除去するためにDBSCANでデータをクラスタリングしています。 scikit-learnでのDBSCANの実装では、ほぼ1 GBのデータを処理できないため、計算は非常にメモリを消費します。問題は既に述べられていますhereDBSCANによるクラスタリング中のメモリエラー(大行列演算)
次のコードのボトルネックは、非常にメモリを消費します(行列のサイズ:10mln×10mln)。 DBSCANの計算を最適化する方法はありますか?
私の簡単な調査によれば、計算を実行可能にするために、マトリックスを何らかの方法で疎行列に減らす必要があることがわかりました。この問題を解決するための方法を
私のアイデア:
- は
- スパース行列を作成し、計算行列の部分を計算し、ファイルに保存し、データの小さなサブセットにDBSCANを実行後に
- それらをマージそして、ELKIツールのJavaに結果に
- スイッチをマージし、使用
コード:
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-learn DBSCAN memory usage]の複製(https://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage) –