2-точечная кластеризация - PullRequest
19 голосов
/ 15 октября 2010

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

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

Мне нужен алгоритм для эффективного вычисления этого (желательно без использования сложных методов пространственного хеширования, таких как 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)
);

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

Ответы [ 5 ]

10 голосов
/ 15 октября 2010

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

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

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

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

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

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

3 голосов
/ 15 октября 2010

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

http://www.cs.umd.edu/~mount/Projects/KMeans/
(Программа распространяется на условиях Стандартной общественной лицензии GNU.)

k-средних, k-медианы, k-медоиды, древовидный кластер, самоорганизующиеся карты, кластерные центроиды, кластерное расстояние http://bonsai.hgc.jp/~mdehoon/software/cluster/cluster.pdf

2 голосов
/ 21 октября 2010

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

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

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

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

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

2 голосов
/ 15 октября 2010

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

2 голосов
/ 15 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...