2013-07-03 2 views
5

sklearn.clustering.DBSCAN에 대한 입력을 사전 처리해야합니까? 예에서 scikit-learn에서 입력 DBSCAN을 축척하는 방법

입력 X를 계산 샘플 정규화 사이 http://scikit-learn.org/stable/auto_examples/cluster/plot_dbscan.html#example-cluster-plot-dbscan-py 거리 : v0.14 대한 또 다른 예에서

D = distance.squareform(distance.pdist(X)) 
S = 1 - (D/np.max(D)) 
db = DBSCAN(eps=0.95, min_samples=10).fit(S) 

(http://jaquesgrobler.github.io/online-sklearn-build/auto_examples/cluster/plot_dbscan.html) 몇몇 스케일링이 수행된다

X = StandardScaler().fit_transform(X) 
db = DBSCAN(eps=0.3, min_samples=10).fit(X) 

I 후자의 예제를 기반으로 내 코드를 만들고이 스케일링으로 인상 클러스터링이 잘 작동하도록하십시오. 그러나이 스케일링은 "단위 분산에 대한 평균 및 스케일링을 제거하여 피쳐를 표준화합니다". 나는 2d 클러스터를 찾으려고 노력한다. 제 클러스터가 제곱 된 영역에 분산되어 있다면 - 100x100으로 스케일링에 아무런 문제가 없다고합시다. 그러나,가 사각형 영역에 분포되는 경우. 800x200 스케일링은 샘플을 '압축'하고 한 차원에서 상대 샘플 간의 거리를 변경합니다. 이것은 클러스터링을 악화시키지 않습니까? 아니면 sth을 이해하고 있는가? 잘못된? 일부 사전 처리를 적용해야합니까, 아니면 간단히 '원시'데이터를 입력 할 수 있습니까?

답변

12

당신이하려는 일에 달려 있습니다.

지리 데이터에서 DBSCAN을 실행하고 거리가 미터 단위 인 경우 아무 것도 표준화하지 않고 엡실론 임계 값을 미터 단위로 설정하기를 원하지 않을 것입니다.

예, 특히 균일하지 않은 배율 왜곡 거리입니다. 비 왜곡 스케일링은 다른 엡실론 값을 사용하는 것과 같습니다. 첫 번째 예에서는 명백하게 유사성 아닌 거리 매트릭스가 처리

참고. S = (1 - D/np.max(D))은 유사 행렬을 비 차이 행렬로 변환하는 경험적 방법입니다. Epsilon 0.95는 실제로 관찰 된 최대 불일치의 0.05 이하를 효과적으로 의미합니다. 동일한 결과를 수득한다 대체 버전은 다음

D = distance.squareform(distance.pdist(X)) 
S = np.max(D) - D 
db = DBSCAN(eps=0.95 * np.max(D), min_samples=10).fit(S) 

번째 예에서 반면 fit(X) 실제로 원시 입력 데이터 아닌 거리 행렬을 처리한다. IMHO는 추한 해킹으로,이 방법으로 오버로드합니다. 그것은 편리하지만 오해와 어쩌면 잘못된 사용으로 이어진다.

전체적으로 sklearn의 DBSCAN을 referene으로 사용하지 않습니다. 전체 API는 클러스터링이 아닌 분류에 의해 크게 영향을받는 것으로 보입니다. 일반적으로 클러스터링은 fit이 아니며 감독 방법에 대해서만 수행합니다. 또한 sklearn은 현재 가속을 위해 인덱스를 사용하지 않으며 O(n^2) 메모리가 필요합니다 (일반적으로 DBSCAN은 그렇지 않습니다).

일반적으로 거리가 작동하는지 확인해야합니다.. 거리 함수가 작동하지 않으면 거리 기반 알고리즘이 원하는 결과를 생성합니다. 일부 데이터 세트에서는 유클리드 등의 순한 거리가 처음 데이터를 정규화 할 때 더 잘 작동합니다. 다른 데이터 세트에서는 거리에 대해 잘 알고 있습니다 (예 : 지리 데이터). 표준화를 obivously하는 것은 의미가 없으며 유클리드 거리도 마찬가지입니다.

+0

빠른 답장을 보내 주셔서 감사합니다.나는 무작위로 움직일 수있는 점멸하는 광원을 확인하여 가우시안 번짐을 유발하는 것을 원합니다. 또한 나는 소리가 겹쳐있다. 현재는 깜박임 강도를 무시하고 깜박임 이벤트의 2 차원 위치로만 피드합니다. 유클리드 거리가 괜찮다고 생각하니? 당신의 대답에서 저는 제 경우에 데이터를 전처리 할 필요가 없다는 것을 이해합니다 (nm 위치). 그러나 sklearn 구현은 어떨까요? 그것은 실제로 입력과 유사성을 필요로합니까 아니면 그냥 위치를 부여 할 수 있으며 유클리드 거리 측정 자체를 적용 할 수 있습니까? – Alex

+0

x와 y에 균등 한 간격의 픽셀이 있으면 Euclidean을 정규화하고 사용하지 마십시오. sklearn에 관해서는 문서와 소스 코드를 파헤쳐 야합니다. 원시 데이터를 피드하면 유클리드 거리 매트릭스를 자체적으로 계산합니다. (그러나 가속을 위해 인덱스를 사용하지 마십시오. ELKI를 사용하면 인덱스가 훨씬 빨라야합니다.) –

+0

감사합니다. ELKI를 살펴보고 sklearn 문서를 통해 자신을 파헤쳐 보겠습니다. – Alex

관련 문제