분산 형 플롯으로 시각화 된 2D numpy 어레이에서 각각의 기능 (상태 확률)이있는 약 34,000 개의 데이터 레이블 집합이 입니다.밀도가 높은 데이터 포인트를 수평 적으로 클러스터링합니다.
대다수의 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()
를 얻을 수있다.
최소 샘플 양을 늘리면 노이즈가 작은 세로선이 생기고 세로선이 길어지고 밀도가 높아집니다.
는 또한 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 데이터 포인트의 밀도가 높은 영역을 어떻게 추출 할 수 있습니까?
[This] (http://i.stack.imgur.com/i1wp7.png)는 scipy 계층 알고리즘을 사용한 후에 비슷한 분류입니다. – dmuhs
데이터의 크기를 조정하십시오. x 축의 범위는 0에서 35,000까지이며 y 축은 0에서 1까지입니다. 수직 거리는 수평 거리보다 훨씬 작으므로 알고리즘이 데이터 포인트를 수직으로 클러스터링합니다. Scikit-learn (http://scikit-learn.org/stable/modules/preprocessing.html)의 전처리 유틸리티를 확인하십시오. – MaSdra
아마도이 것을 지나치는 생각을했을 것입니다. y 값에 임계 값을 적용하는 것만으로도 매우 잘할 수있는 것처럼 보입니다. 중앙값 +/- 0.01. –