Березовий алгоритм не кластеризується, як очікувалося


10

Я використовую алгоритм Birch з пакету scipy-learn Python для кластеризації набору точок в одному невеликому місті в наборах по 10.

Я використовую наступний код:

no = len(list_of_points)/10
brc = Birch(branching_factor=50, n_clusters=no, threshold=0.05,compute_labels=True)

На мою думку, я завжди закінчував би наборами з 10 балів. У моєму випадку зараз у мене 650 балів, а n_clusters - 65.

Але моя проблема полягає в тому, що при занадто низькому порозі я закінчую 1 кластером адреси, просто маленьким більшим порогом - 40 адресами на кластер.

Що я тут роблю неправильно?


Можливо, це CRS. Проблема? Якщо ви намагалися зі ступенем (наприклад, WGS 84), спробуйте метрику. Існує досить велика різниця в координатах, і обидві можуть вимагати різного порогового значення. Також ви можете спробувати з різною бібліотекою python, я настійно рекомендую використовувати scikit-learn.
dmh126

..erm, я кластеризуюсь на основі координат GPS, отриманих від API Google, я припускаю, що вони мають стандартний формат. Ні?
кабум

Можливо, вставити сюди ці координати, я спробую це розібратися.
dmh126

dmh126 може бути правильним: Goolge API працює з WGS84, це (Всесвітня) геодезична система, а не метрика
André

Відповіді:


10

Я провів деякі дослідження. Я взяв кілька пунктів у двох системах координат не метричних (WGS84) та метричних (Польща 1992).

Я використовував цей код:

from scipy import loadtxt
from sklearn.cluster import Birch
import matplotlib.pyplot as plt

data84 = loadtxt("/home/damian/workspace/84.csv", delimiter=",")
data90 = loadtxt("/home/damian/workspace/90.csv", delimiter=",")

brc = Birch(threshold=0.5)

Тоді я підходжу нашу модель до метричних даних:

brc.fit(data90)

І побудуйте результати, де хрестиками були мої точки, а кола - мої підкластери:

c = brc.subcluster_centers_
plt.plot(data90[:,0], data90[:,1], '+')
plt.plot(c[:,0], c[:,1], 'o')
plt.show()

Ось що я отримав: введіть тут опис зображення

Ви можете бачити, що це порогове значення було занадто малим, оскільки воно знаходило підкластер у кожній точці.

Визначення порогу:

Радіус підкластера, отриманий при злитті нового зразка і найближчого підкластера, повинен бути меншим від порогового. Інакше запускається новий підкластер.

Тож у цьому випадку нам потрібно збільшити це значення.

Для:

brc = Birch(threshold=5000)

це було набагато краще:

введіть тут опис зображення

І WGS84 бали для порогу 0,5:

brc = Birch(threshold=0.5)
brc.fit(data84)

введіть тут опис зображення

Лише один підклас, не добре. Але в цьому випадку ми повинні зменшити порогове значення, тому на 0,05:

brc = Birch(threshold=0.05)
brc.fit(data84)

введіть тут опис зображення

У нас хороші результати.

Висновок:

CRS має значення. Вам потрібно знайти правильне порогове значення, що залежить від ваших систем координат даних та відстані між точками. Якщо у вас неметрічна CRS, поріг повинен бути порівняно меншим, ніж у метричній системі. Ви повинні знати різницю між метрами та градусами, якщо відстань між двома точками дорівнює 10000 м, це буде менше 1 градуса в WGS84. Перевірте google на більш точні значення.

Також є більше балів, ніж значення n_clusters. Це нормально, є не центроїди кластерів, а підкластери. Якщо ви спробуєте щось передбачити або надрукувати мітки, він віднесе вашу точку до однієї з областей n_clusters (або пунктів друку, віднесених до 0,1,2, ..., n_clusters label).

Якщо ви не хочете спробувати різні параметри, ви завжди можете скористатися іншим алгоритмом. Дуже простим і поширеним алгоритмом кластеризації є алгоритм K-засобів.

http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

Він повинен знайти n кластерів для ваших даних, не піклуючись про пороги тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.