Ich gruppiere Daten mit DBSCAN, um Ausreißer zu entfernen. Die Berechnung ist sehr speicherintensiv, da die Implementierung von DBSCAN in scikit-learn fast 1 GB Daten nicht verarbeiten kann. Das Problem wurde bereits erwähnt hereSpeicherfehler beim Clustering mit DBSCAN (große Matrixberechnung)
Der Engpass des folgenden Codes scheint die Matrixberechnung zu sein, die sehr speicherintensiv ist (Größe der Matrix: 10mln x 10mln). Gibt es eine Möglichkeit, die Berechnung von DBSCAN zu optimieren?
Meine kurze Forschung zeigt, dass die Matrix in irgendeiner Weise auf eine spärliche Matrix reduziert werden sollte, um es machbar zu machen.
Meine Ideen, wie dieses Problem zu lösen:
- erstellen und eine spärliche Matrix
- berechnen Teile Matrix berechnen und sie in Dateien speichern und kombinieren sie später
- führen DBSCAN auf kleine Teilmengen von Daten und Zusammenführen der Ergebnisse
- Umstellung auf Java und verwenden ELKI Werkzeug
Code:
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)
Mögliche Duplikat [Scikit-Learn DBSCAN Speichernutzung] (https://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage) –