使用DBSCAN进行聚类时的内存错误(大矩阵计算)

时间:2017-04-18 13:48:20

标签: python out-of-memory sparse-matrix dbscan

我使用DBSCAN对数据进行聚类以删除异常值。计算非常耗费内存,因为在scikit-learn中实现DBSCAN无法处理几乎1 GB的数据。问题已经提到here

以下代码的瓶颈似乎是矩阵计算,这非常消耗内存(矩阵大小:10mln x 10mln)。有没有办法优化DBSCAN的计算?

我的简短研究表明,矩阵应该以某种方式简化为稀疏矩阵,以使其可行计算。

我的想法如何解决这个问题:

  1. 创建并计算稀疏矩阵
  2. 计算矩阵的部分并将其保存到文件中并稍后合并
  3. 对小型数据子集执行DBSCAN并合并结果
  4. 切换到Java并使用ELKI工具
  5. 代码:

    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)
    

1 个答案:

答案 0 :(得分:0)

1到3将无效。

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

  2. DBSCAN不使用距离矩阵。

  3. 处理零件,然后合并并不那么容易(有GriDBSCAN,它为Euclidean fistance做这个)。您不能随意使用随机分区并在以后合并它们。