我使用DBSCAN对数据进行聚类以删除异常值。计算非常耗费内存,因为在scikit-learn中实现DBSCAN无法处理几乎1 GB的数据。问题已经提到here
以下代码的瓶颈似乎是矩阵计算,这非常消耗内存(矩阵大小:10mln x 10mln)。有没有办法优化DBSCAN的计算?
我的简短研究表明,矩阵应该以某种方式简化为稀疏矩阵,以使其可行计算。
我的想法如何解决这个问题:
代码:
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 :(得分:0)
1到3将无效。
您的数据非常密集。没有“大多数为0”,因此稀疏格式实际上需要更多更多内存。确切的阈值会有所不同,但根据经验,稀疏格式至少需要90%的0才能生效。
DBSCAN不使用距离矩阵。
处理零件,然后合并并不那么容易(有GriDBSCAN,它为Euclidean fistance做这个)。您不能随意使用随机分区并在以后合并它们。