Коэффициенты силуэта DBSCAN: работает ли этот цикл? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь сравнить результаты вычислений Silhouette Score моих одноклассников с моими, и у меня возникли некоторые проблемы с тем, чтобы обернуть голову вокруг их цикла for. Я не ищу халяву, мы уже представили ниже для оценки, просто пытаюсь понять, что здесь происходит для дальнейшего использования.

Вопрос:

Использование DBSCAN итерации (для цикла) по различным значениям min_samples (от 1 до 10) и epsilon (от .05 до .5, с шагом .01) для поиска кластеров в дорожных данных, используемых в уроке, и расчета Silohouette Coeff для min_samples и epsilon.

дорожно-данные:

             osm         lat          lon         alt
0      144552912    9.349849    56.740876   17.052772
1      144552912    9.350188    56.740679   17.614840
2      144552912    9.350549    56.740544   18.083536
...
434873  93323209    9.943451    57.496270   24.635285

434874 rows × 4 columns

(Обновленное редактирование) Нормализовано:

#Normalize sample from dataset
XX = X.copy()
XX['alt'] = (X.alt - X.alt.mean())/X.alt.std()
XX['lat'] = (X.lat - X.lat.mean())/X.lat.std()
XX['lon'] = (X.lon - X.lon.mean())/X.lon.std()

Цикл одноклассников:

start   = 0.0
stop    = 0.45
step    = 0.01
my_list = np.arange(start, stop+step, step)

startb   = 1
stopb    = 10
stepb    = .2 # To scale proportionately with epsilon increments
my_listb = np.arange(startb, stopb+stepb, stepb)

my_range = range(45)

one = []

for i in tqdm(my_range):
   dbscan = DBSCAN(eps = .05 + my_list[i] , min_samples = 1 + my_listb[i])
   XX.cluster = dbscan.fit_predict(XX[['lat','lon']])
   one.append(metrics.silhouette_score(XX[['lat', 'lon']], XX.cluster))

Classmates figure

My Loop (s):

(я разбил свое решение на 10 циклов, по одному для каждого min_sample (1-10). Примеры ниже.)

#eps loop 0.05 to 0.5 (steps 0.01) min_samples=1

eps_range = [x / 100.0 for x in range(5,51,1)]
eps_scores_1 = []
for e in tqdm(eps_range):
dbscan = DBSCAN(eps=e, min_samples=1)
labels = dbscan.fit_predict(XX[['lon', 'lat', 'alt']])
eps_scores_1.append(metrics.silhouette_score(XX[['lon', 'lat', 'alt']],labels))

-

#eps loop 0.05 to 0.5 (steps 0.01) min_samples=2

eps_range = [x / 100.0 for x in range(5,51,1)]
eps_scores_2 = []
for e in tqdm(eps_range):
dbscan = DBSCAN(eps=e, min_samples=2)
labels = dbscan.fit_predict(XX[['lon', 'lat', 'alt']])
eps_scores_2.append(metrics.silhouette_score(XX[['lon', 'lat', 'alt']],labels))

My Figure

Что я наблюдаю, насколько различия:

  1. Одноклассник не включил «alt» в цикл for.
  2. Одноклассник предпринял попытку какого-то вложенного цикла?
  3. Диапазон одноклассников 45, не уверен, что это правильно.
  4. Одноклассник my_list не в правильной записи?
  5. Максимальные баллы силуэта одноклассника намного выше, чем у меня.
  6. (не показано) Одноклассник использовал 10000 случайных выборок, я использовал 30000 случайных выборок.

1 Ответ

0 голосов
/ 31 октября 2018

Вопрос требует изменения как миноров, так и эпсилонов - для этого требуется вложенная петля . Ваш одноклассник использовал одну петлю и не рассматривал комбинации. Вы сделали внешний цикл путем копирования и вставки.

Ваш одноклассник использует очень вводящий в заблуждение способ управления диапазоном, потому что он добавляет 0,05 соответственно на 1 позже!

Вы не можете просто смешивать широту, долготу и высоту. У них разные юниты. На самом деле, вы не должны даже смешивать широту и долготу из-за искажений - используйте вместо этого расстояние Хаверсайн!

Силуэт предполагает выпуклые кластеры, но DBSCAN не генерирует выпуклые кластеры.

Реализация sklearn, вероятно, обрабатывает шум как кластер, что обычно дает худшие результаты. Но на самом деле Silhouette не предназначен для использования с шумовыми метками ...

...