Я сделал некоторые исследования. Я взял некоторые точки в двух системах координат: неметрических (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 кластеров для ваших данных, не заботясь о порогах и т. Д.