Найти, какие точки принадлежат кластеру в DBSCAN в Python - PullRequest
0 голосов
/ 10 апреля 2019

Привет, ребята. Я установил модель DBSCAN на набор баллов (4953 балла).Теперь мне нужно найти точки, которые принадлежат к разным кластерам, т. Е. Ко всем кластерам относятся все входные значения. У меня всего 10 кластеров. Как я могу это выяснить?

db = DBSCAN(eps=0.0003,min_samples=20,n_jobs=-1).fit(X_scaled)
y_pred = db.fit_predict(X_scaled)
pred_labels = db.labels_
print(len(pred_labels))
n_clusters_ = len(set(pred_labels))- (1 if -1 in pred_labels else 0)
print(n_clusters_)
plt.scatter(list(range(len(df_median2))),X_scaled[:,0],c=y_pred, cmap='Paired')
plt.ylim(0.1,0.4)

Выше приведенокод.

1 Ответ

1 голос
/ 10 апреля 2019

У вас есть массив X_scaled входных значений (и, возможно, массив X исходных значений до масштабирования) и массив pred_labels меток кластера. Значение n_clusters_ будет на единицу больше, чем значение len(set(pred_labels)), если некоторые выборки не были назначены кластеру и были отнесены к категории шумов. Но два массива имеют одинаковое количество элементов в одинаковом порядке, поэтому вы можете искать значения в массиве pred_labels для каждого элемента в массиве X_scaled, например, pred_labels[0] вернет метку кластера для первого образца , Если вы видите -1 среди любых меток, это не метки кластера, а просто способ обозначить выборки шума, не назначенные ни одному кластеру.

Вы также можете объединить два массива, чтобы метки кластера сохранялись рядом с исходными образцами:

import numpy as np
samples_w_lbls = np.concatenate((X_scaled,pred_labels[:,np.newaxis]),axis=1)

Затем вы можете отфильтровать этот объединенный массив в строки, имеющие определенное значение метки кластера:

#Get rows with cluster label value of 5:
filter = np.asarray([5])
samples_w_lbls[np.in1d(samples_w_lbls[:,-1], filter)]
...