Подтвердить что ты не робот

2-точечная кластеризация

Задано: Учитывая множество N точек в 2D плоскости (координаты x и y) и множество N радиусов, соответствующих каждой точке. Мы будем ссылаться на точечный диск как диск, центрированный в точке с его радиусом.

Проблема: Скопируйте точки. Кластер точек таков, что каждая точка EITHER попадает в диск по меньшей мере одной другой точки в кластере ИЛИ, по крайней мере, одна другая точка в кластере попадает в ее диск. Кластеры отдельных точек не считаются кластерами.

Мне нужен алгоритм для его эффективного вычисления (желательно, не прибегая к сложным методам пространственного хэширования, таким как kd-деревья). Я могу рассчитывать на время работы O (N ^ 2), но определенно не более O (N ^ 3). Я чувствую, что это должно быть просто, но я попадаю на невзаимную природу моего состояния кластеризации.

В сущности, я хочу заполнить прототип функции C:

int cluster_points(
    size_t n,
    point_t *pt, // length n list of points
    double *radius, // length n list of radii for each point
    int *cluster, // length n list of cluster indexes; -1 if not clustered
    size_t *ncluster // number of clusters (number of distinct non -1 entries in cluster)
);

Это не домашнее задание. Мне нужно это как часть матричного алгоритма кластеризации комплексных чисел.

4b9b3361

Ответ 1

Решение грубой силы - это только O (N 2), поэтому оно должно работать для вас.

1) Начните со всех точек в неназначенной группе.

2) Выберите одну точку и посмотрите на все остальные в неназначенной группе и посмотрите, соответствуют ли они критерию радиусов.

  • 2a) Если да, запустите группу и продолжайте со всеми остальными точками, чтобы увидеть, соответствуют ли они этой группе (исходя из вашей текущей точки), и если они вписываются, переместите их из неназначенной группы в эту новую.
  • 2ab). Когда вы закончите с текущей точкой, перейдите к каждой добавленной группе и проверьте все точки в неназначенной группе.
  • 2b) Но, если ни одна точка не соответствует критериям радиуса для текущей точки, отбросьте ее.

3) В конце вы сгруппировали точки по вашим критериям и сделаете не более N * (N/2) проверок.

Btw, то, что вы описываете, не является тем, что обычно подразумевается под "кластеризацией", поэтому я думаю, что это бросает людей сюда. То, что затрудняет кластеризацию, состоит в том, что вопрос о том, будут ли две соседние точки назначены одному кластеру, определяется всеми остальными точками набора данных. В вашем случае это (в основном) определяется только свойствами двух точек, так что в вашем случае вы можете просто проверить их все.

Ответ 2

k - означает кластеризацию на основе комбинации локального поиска и алгоритма Ллойда

http://www.cs.umd.edu/~mount/Projects/KMeans/

(Программа распространяется в условиях общедоступной лицензии GNU.)

k-означает, k-медианы, k-медоиды, treecluster, самоорганизующиеся карты, clustercentroids, clusterdistance http://bonsai.hgc.jp/~mdehoon/software/cluster/cluster.pdf

Ответ 3

Кластеризация - это проблема NP-Hard, даже если вам задано количество кластеров априори, поэтому вы, вероятно, можете отказаться от получения полиномиального времени выполнения. Существует много методов для этого, и литература в основном встречается в сообществе машинного обучения, k-средство, вероятно, самый простой алгоритм для понимания и реализации.

Ответ 4

Похоже, что очевидным алгоритмом O (n ^ 2) было бы создание графика с точками в виде вершин, а затем соединение двух точек, если выполняются условия, которые вы даете. И затем вы читаете подключенные компоненты графика, отбрасывая одноточие. Кроме того, условие, которое вы дали для кластеризации, звучит симметрично для меня. Я что-то пропустил?

Ответ 5

У вас есть коллекция U пар (p, R), где p - точка и R - ее радиус.

Отношение ~ на U: (p, R) ~ (q, S) <= > p лежит в q-диске или q лежит в p-диске &lt = = | p-q | <= max (R, S)

явно рефлексивно и симметрично, поэтому транзитивное замыкание (~, скажем) является отношением эквивалентности. Классы эквивалентности в ~ будут (одноточечные или) кластеры.

Я верю, что существуют стандартные алгоритмы для вычисления классов эквивалентности транзитивного замыкания отношения типа ~ выше. Например, это обсуждается в Numerical Recipes в главе по сортировке, и они говорят, что их подпрограмма основана на Knuth.

(Извините, что не предоставил ссылку, но краткий поиск не придумал именно то, что нужно).