2017-04-18 1 views
0

이상한 데이터를 제거하기 위해 DBSCAN을 사용하여 데이터를 클러스터링합니다. 계산은 scikit-learn에서 DBSCAN의 구현이 거의 1GB의 데이터를 처리 할 수 ​​없기 때문에 매우 많은 메모리를 소비합니다. 문제가 이미 언급되었습니다. hereDBSCAN (대규모 매트릭스 계산)을 사용한 클러스터링 중 메모리 오류

다음 코드의 병목 현상은 매우 많은 메모리를 소비합니다 (매트릭스 크기 : 10mln x 10mln). DBSCAN의 계산을 최적화하는 방법이 있습니까?

간략한 연구에 따르면 매트릭스는 희박한 매트릭스로 축소되어야 계산이 가능합니다. 이 문제를 해결하는 방법을

내 아이디어 :

  1. 생성 및 스파 스 매트릭스를 계산 행렬의
  2. 계산 부품 파일에 저장하고 나중에
  3. 을 병합 데이터의 작은 부분 집합에 DBSCAN을 수행 및 ELKI 도구 자바에 결과를
  4. 스위치를 통합하고 사용

코드 :

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 메모리 사용법] (https://stackoverflow.com/questions/16381577/scikit-learn-dbscan-memory-usage)의 가능한 복제본 –

답변

0

1 대 3은 작동하지 않습니다.

  1. 데이터가 밀집되어 있습니다. "대부분 0"이 없기 때문에 스파 스 형식에는 실제로 많은 메모리가 필요합니다. 정확한 임계 값은 다양하지만 일반적으로 스파 스 형식을 효과적으로 적용하려면 최소 90 %의 0이 필요합니다.

  2. DBSCAN은 거리 매트릭스를 사용하지 않습니다.

  3. 부품 작업을하면 병합이 쉽지 않습니다 (GriDBSCAN이 유클리드 기준으로 작동합니다). 임의의 파티션을 가져 와서 나중에 병합 할 수는 없습니다.

관련 문제