Кластеризация позиций на карте, где каждый кластер имеет одинаковое количество точек - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть определенные c точки на карте, и мне нужно, чтобы они были сгруппированы в разные кластеры с одинаковым размером, и последний кластер может быть count %n. Я читаю эти ответы 1 , 2 и 3 , но это не помогает. Я пробовал другой способ, но ни один из них не работает. В этом коде я указываю c n_clusters=4, потому что это лучшее число кластера, которое я могу отсортировать и взять n лучших точек из отсортированной точки, а затем я go пройду по всем точкам , Например, мне нужно, чтобы точки 32, показанные на рисунке, были кластеризованы в кластеры 4, и каждый кластер имеет 8 точек enter image description here

dfcluster = DataFrame(position, columns=['x', 'y'])
kmeans = KMeans(n_clusters=4).fit(dfcluster)
centroids = kmeans.cluster_centers_

# plt.scatter(dfcluster['x'], dfcluster['y'], c=kmeans.labels_.astype(float), s=50, alpha=0.5)
# plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=50)
# plt.show()
dfcluster['cluster'] = kmeans.labels_
dfcluster=dfcluster.drop_duplicates(['x', 'y'], keep='last')
dfcluster = dfcluster.sort_values(['cluster', 'x', 'y'], ascending=True)
# d=pd.DataFrame()
# m = pd.DataFrame()
# n=8
# for x in range(4) :
#     m= dfcluster[dfcluster.cluster == x]
#
#
#     if len(m) > int( n /2)-1:
#         m=m.head(int(n/2)-1)
#         # for idx, row in m.iterrows():
#         #     print("code3 group",  "=", row['cluster'])
#         d=d.append(m,ignore_index = True)
#
#     else :
#         d=d.append(m,ignore_index = True)
#
#
# if len(d)>=n:
#     dfcluster = d
# dfcluster.groupby('cluster').nth(n))
dfcluster=dfcluster.head(n)
i=0
if (len(dfcluster )< n):
   change_df()

1 Ответ

0 голосов
/ 08 мая 2020

Я не понимаю вопроса. Сама кластеризация будет определять, какое количество точек данных на кластер является желательным. Если вы хотите разбить данные на 4 одинаково большие группы, основанные на близости, то вы должны определить 4 точки, которые находятся наиболее далеко друг от друга, а затем итеративно добавить ближайшего соседа к этим точкам данных, если они не уже в кластере. Я не ожидал бы, что это будет выглядеть красиво.

...