2016-09-20 5 views
0

분산 형 플롯으로 시각화 된 2D numpy 어레이에서 각각의 기능 (상태 확률)이있는 약 34,000 개의 데이터 레이블 집합이 like this입니다.밀도가 높은 데이터 포인트를 수평 적으로 클러스터링합니다.

대다수의 b 데이터 포인트가 맨 아래에 있고 상당히 밀집되어 있음을 쉽게 알 수 있습니다. 클러스터링 알고리즘을 사용하여 아래 영역을 추출하고 싶습니다. 나는 완벽한 결과를 얻기 위해 노력하지 않습니다. 이것은 단순히 b 점의 대부분을 추출하는 것입니다.

지금까지 나는 DBSCAN 알고리즘을 시도 :

import sklearn.cluster as sklc 

data1, data2 = zip(*dist_list[1]) 
data = np.array([data1, data2]).T 

core_samples, labels_db = sklc.dbscan(
    data, # array has to be (n_samples, n_features) 
    eps=2.0, 
    min_samples=5, 
    metric='euclidean', 
    algorithm='auto' 
) 
core_samples_mask = np.zeros_like(labels_db, dtype=bool) 
core_samples_mask[core_samples] = True 

unique_labels = set(labels_db) 

n_clusters_ = len(unique_labels) - (1 if -1 in labels_db else 0) 

colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels))) 
for k, col in zip(unique_labels, colors): 
    if k == -1: 
     # Black used for noise. 
     col = 'k' 

    class_member_mask = (labels_db == k) 

    xy = data[class_member_mask & core_samples_mask] 
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6) 

    xy = data[class_member_mask & ~core_samples_mask] 
    plt.plot(xy[:, 0], xy[:, 1], 'x', markerfacecolor=col, markeredgecolor='k', markersize=4) 

plt.rcParams["figure.figsize"] = (15, 15) 
plt.title('Estimated number of clusters: %d' % n_clusters_) 
plt.show() 

this plot를 얻을 수있다.

최소 샘플 양을 늘리면 노이즈가 작은 세로선이 생기고 세로선이 길어지고 밀도가 높아집니다.

는 또한 scipy.cluster.hierarchy 클러스터링 시도 :

thresh = 2 
clusters = hcluster.fclusterdata(data, thresh, criterion="distance") 

plt.scatter(*data.T, c=clusters) 
title = "t=%f, n=%d" % (thresh, len(set(clusters))) 
plt.title(title) 
plt.show() 

유사한 수직 분류를 초래한다. 줄거리에 대한 의견을보십시오. 내 평판과 함께 아직 두 개 이상의 링크를 게시 할 수 없습니다.

내 질문은, 내가 알고리즘의 보정에 실수를 했나요? 또는 알고리즘의 선택이 처음부터 잘못 되었습니까? b 데이터 포인트의 밀도가 높은 영역을 어떻게 추출 할 수 있습니까?

+0

[This] (http://i.stack.imgur.com/i1wp7.png)는 scipy 계층 알고리즘을 사용한 후에 비슷한 분류입니다. – dmuhs

+0

데이터의 크기를 조정하십시오. x 축의 범위는 0에서 35,000까지이며 y 축은 0에서 1까지입니다. 수직 거리는 수평 거리보다 훨씬 작으므로 알고리즘이 데이터 포인트를 수직으로 클러스터링합니다. Scikit-learn (http://scikit-learn.org/stable/modules/preprocessing.html)의 전처리 유틸리티를 확인하십시오. – MaSdra

+0

아마도이 것을 지나치는 생각을했을 것입니다. y 값에 임계 값을 적용하는 것만으로도 매우 잘할 수있는 것처럼 보입니다. 중앙값 +/- 0.01. –

답변

0
  1. 절대 ID 속성을 포함하지 마십시오. 귀하의 "노드 인덱스"는 유사성 계산에 사용되어서는 안됩니다.

  2. 속성의 단위와 눈금이 다른 경우 매우 신중해야합니다. 일반적인 휴리스틱은 StandardScaler이며, 즉 각 속성을 단위 분산으로 정규화합니다. 그러나 데이터 분포 (x에 대한 균일, y에 대한 왜곡)를 감안할 때 표준화 사용은 이론에 의해 잘 지원된다고 생각하지 않습니다. 가우스 분포를 가정합니다.

이러한 두 가지 조합으로 인해 결과가 나타납니다. 즉, x 축은 결과를 완전히 지배합니다. 문자 그대로 Y 축보다 영향이 10000 배 이상입니다. 노드 ID를 기반으로 효과적으로 클러스터링하고 있습니다 ...

"그냥 작동합니다"을 절대로 가정하지 마십시오. 이러한 모든 방법은 전처리에 민감하므로 매우이므로주의해서 적용해야합니다.

관련 문제