Алгоритм Березы не кластеризован должным образом

10

Я использую алгоритм Берча из пакета Python scipy-learn для кластеризации набора точек в одном маленьком городе по 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 адресов на кластер.

Что я здесь не так делаю?

Kaboom
источник
Может быть, это CRS. Проблема? Если вы пробовали со степенями (например, WGS 84), попробуйте метрику. Существует довольно большая разница в координатах, и для обоих может потребоваться различное пороговое значение. Также вы можете попробовать разные библиотеки Python, я настоятельно рекомендую использовать scikit-learn.
dmh126
..erm, я кластеризую на основе GPS-координат, полученных из Google API, я предполагаю, что они имеют стандартный формат. Нет?
kaboom
Может быть, вставьте сюда эти координаты, я постараюсь выяснить это.
dmh126
dmh126 может быть прав: API Goolge работает с WGS84, это (мировая) геодезическая система, а не метрика
Андре

Ответы:

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).

Если вы не хотите использовать другие параметры, вы всегда можете выбрать другой алгоритм. Очень простым и распространенным алгоритмом кластеризации является алгоритм K-средних.

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

Он должен найти n кластеров для ваших данных, не заботясь о порогах и т. Д.

dmh126
источник