Как выбрать точки с обычной плотностью

как выбрать подмножество точек с обычной плотностью? Более формально,

Дано

  1. набор A неравномерно расположенных точек,
  2. метрика расстояния dist (например, евклидово расстояние),
  3. и целевая плотность d,

как я могу выбрать наименьшее подмножество B, которое удовлетворяет ниже?

  • для каждой точки x в A,
  • существует точка y в B
  • который удовлетворяет dist(x,y) <= d

Мой текущий лучший шанс -

  • начните с самого A
  • выбрать ближайшую (или просто особенно близкую) пару точек
  • случайным образом исключить один из них
  • повторять до тех пор, пока выполняется условие

и повторите всю процедуру на удачу. Но есть ли лучшие способы?

Я пытаюсь сделать это с 280 000 точек 18-D, но мой вопрос касается общей стратегии. Поэтому я также хочу знать, как это сделать с 2-D точками. И мне действительно не нужна гарантия наименьшего подмножества. Любой полезный метод приветствуется. Спасибо.


восходящий метод

  • выбрать случайную точку
  • выбрать среди невыбранных y, для которых min(d(x,y) for x in selected) является самым большим
  • Продолжай двигаться!

Я назову его восходящим, а тот, который я изначально опубликовал, - сверху вниз. Вначале это намного быстрее, поэтому для разреженной выборки это должно быть лучше?

мера эффективности

Если гарантия оптимальности не требуется, я думаю, что эти два индикатора могут быть полезны:

  • радиус покрытия: max {y in unselected} min(d(x,y) for x in selected)
  • радиус экономики: min {y in selected != x} min(d(x,y) for x in selected)

RC — это минимально допустимый d, и между ними нет абсолютного неравенства. Но RC <= RE желательнее.

мои маленькие методы

Для небольшой демонстрации этого «показателя производительности» я сгенерировал 256 двумерных точек, распределенных равномерно или по стандартному нормальному распределению. Затем я попробовал с ними методы «сверху вниз» и «снизу вверх». И вот что я получил:

bottom-up.normсверху вниз.норма

RC красный, RE синий. Ось X — количество выбранных точек. Вы думали, что «снизу вверх» может быть так же хорошо? Я так и думал, глядя на анимацию, но кажется, что сверху вниз значительно лучше (посмотрите на разреженную область). Тем не менее, не так уж ужасно, учитывая, что это намного быстрее.

Вот и упаковал все.

http://www.filehosting.org/file/details/352267/density_sampling.tar.gz


person h2kyeong    schedule 11.06.2012    source источник
comment
Я не вижу, как ваши методы удовлетворяют указанному условию (for every x in A there is an y in B such that dist(x, y) < d) в предоставленном вами коде. Я также не могу найти пакет python h2, который вы используете.   -  person salva    schedule 18.06.2012
comment
Мой маленький метод делает это в обратном порядке - он создает выборки, которые эффективны для некоторых d. И извините, h2 это моя коллекция повторно используемых фрагментов кода... Я не знал, что использовал его.   -  person h2kyeong    schedule 02.07.2012


Ответы (4)


Генетический алгоритм, вероятно, может дать здесь хорошие результаты.

обновить:

Я немного поиграл с этой проблемой, и вот мои выводы:

Простой метод (назовем его случайным выбором) для получения набора точек, удовлетворяющих заявленному условию, заключается в следующем:

  1. начните с B пустым
  2. выберите случайную точку x из A и поместите ее в B
  3. удалить из A каждую точку y такую, что dist(x, y) ‹ d
  4. пока A не пусто перейти к 2

Kd-дерево можно использовать для относительно быстрого выполнения поиска на шаге 3.

Эксперименты, которые я провел в 2D, показывают, что сгенерированные подмножества примерно вдвое меньше, чем те, которые были сгенерированы вашим нисходящим подходом.

Затем я использовал этот алгоритм случайного выбора, чтобы запустить генетический алгоритм, который привел к дополнительному уменьшению размера подмножеств на 25%.

Для мутации, дающей хромосому, представляющую подмножество B, я случайным образом выбираю гипершар внутри минимального выровненного по оси гиперблока, который покрывает все точки в A. Затем я удаляю из B все точки, которые также находятся в гипершаре, и использую случайный -выбор, чтобы завершить его снова.

Для кроссовера я применяю аналогичный подход, используя случайный гипершар для разделения хромосом матери и отца.

Я реализовал все на Perl, используя оболочку для GAUL (GAUL можно получить по адресу здесь.

Скрипт находится здесь: https://github.com/salva/p5-AI-GAUL/blob/master/examples/point_density.pl

Он принимает список n-мерных точек из стандартного ввода и генерирует набор изображений, показывающих лучшее решение для каждой итерации генетического алгоритма. Сопутствующий скрипт https://github.com/salva/p5-AI-GAUL/blob/master/examples/point_gen.pl можно использовать для генерации случайных точек с равномерным распределением.

person salva    schedule 13.06.2012
comment
Не могли бы вы рассказать об этом немного подробнее? Конечно, если вы ничего не знаете о проблемной области, всегда можно использовать генетический алгоритм. - person Christian Rau; 13.06.2012
comment
@Christian, да, вы можете использовать растровые изображения для представления покрывающих подмножеств. В качестве функции взвешивания вы можете использовать количество битов (количество точек в покрывающем подмножестве), а для размножения, например, вы можете смешивать два растровых изображения, выбирая подстроки для обоих случайным образом и восстанавливая их, чтобы гарантировать, что они покрывают подмножества. - person salva; 13.06.2012
comment
@Christian, на самом деле, я пытаюсь написать полное решение :-) - person salva; 13.06.2012
comment
так что вы видите это как установить проблему покрытия. Надеюсь, вы найдете хорошие методы размножения/мутирования... особенно разведения. - person h2kyeong; 14.06.2012

Вы можете смоделировать свою задачу с помощью графов, принять точки за узлы и соединить два узла ребром, если расстояние между ними меньше, чем d. Теперь вам нужно найти минимальное количество вершин, чтобы они были связаны вершины покрывают все вершины графа, это минимальная проблема покрытия вершин (что в общем случае является NP-Hard ), но вы можете использовать быструю 2-аппроксимацию: неоднократно брать обе конечные точки ребра в вершинное покрытие, а затем удалять их из графа.

P.S: конечно, вы должны выбрать узлы, которые полностью отключены от графа. После удаления этих узлов (означает их выбор) ваша проблема заключается в покрытии вершин.

person Saeed Amiri    schedule 11.06.2012
comment
Да, эта проблема относится к набору обложек. Но в этой задаче мы имеем общее свойство: если А и В близки, а В и С близки, то А и С стремятся быть близкими. Вот почему я думаю, что может быть лучший способ. Спасибо. - person h2kyeong; 11.06.2012
comment
@h2kyeong, откуда у вас это свойство? Если A и B близки, а B и C близки, то A и C имеют тенденцию быть близкими? предположим, что A, B и C находятся на прямой линии (сначала A, затем B, затем C), и ||A-B||=d, ||B-C||=d, but ||A-C|| = 2d. Таким образом, вы не можете предположить, что у вас есть это свойство, за исключением того, что вы явно упомянули об этом в своем вопросе, и в этом случае проблема слишком проста. - person Saeed Amiri; 11.06.2012
comment
да, например, при евклидовом расстоянии верхний предел равен 2 d, а нижний предел равен нулю. Я не говорю, что это ограничено d; но 2 d по-прежнему пропорционально мало. При этом функция расстояния может присваивать произвольные значения всем парам точек, и все равно это будет подзадача вершинного покрытия. - person h2kyeong; 11.06.2012
comment
@h2kyeong, я не могу понять, что вы имеете в виду, если вы устанавливаете лимит как d, как вы говорите, что 2d в порядке? - person Saeed Amiri; 12.06.2012
comment
Я просто говорил, что многие функции расстояния далеко не случайны. Так что у нас больше надежд на более быстрое решение, чем на вершинное покрытие. К сожалению, я узнал, что даже выбрать ближайшую пару не так просто в высоких измерениях... - person h2kyeong; 12.06.2012

Вот предложение, в котором делается предположение о манхэттенской метрике расстояния:

  1. Разделите все пространство на сетку детализации d. Формально: разбить A так, чтобы точки (x1,...,xn) и (y1,...,yn) находились в одном и том же разделе точно тогда, когда (floor(x1/d),...,floor(xn/d ))=(этаж(y1/d),...,этаж(yn/d)).
  2. Выберите одну точку (произвольно) из каждого пространства сетки, то есть выберите представителя из каждого набора в разделе, созданном на шаге 1. Не беспокойтесь, если некоторые пространства сетки пусты! Просто не выбирайте представителя для этого пространства.

На самом деле, реализация не должна делать никакой реальной работы, чтобы выполнить первый шаг, а второй шаг можно выполнить за один проход по точкам, используя хэш идентификатора раздела ((floor(x1/d),.. .,floor(xn/d))) чтобы проверить, выбрали ли мы уже представителя для определенного пространства сетки, так что это может быть очень, очень быстро.

Для некоторых других показателей расстояния можно использовать адаптированный подход. Например, евклидова метрика может использовать сетки размера d/sqrt(n). В этом случае вы, возможно, захотите добавить шаг постобработки, который попытается немного уменьшить покрытие (поскольку сетки, описанные выше, больше не являются точно шарами радиуса d — шары немного перекрывают соседние сетки), но я Я не уверен, как эта часть будет выглядеть.

person Daniel Wagner    schedule 20.06.2012
comment
Простое улучшение этого подхода — использование треугольной сетки вместо квадратной. Таким образом, между шарами будет меньше перекрытий. - person salva; 21.06.2012
comment
@salva Что ж, это может быть лучше для двумерной евклидовой метрики, хотя шестиугольники для этого были бы еще лучше. Но ОП, похоже, хочет более многомерную вещь - вы случайно не знаете, что такое 18-мерные мозаичные формы? знак равно - person Daniel Wagner; 21.06.2012
comment
шестиугольная сетка и треугольная сетка — это два вида одной и той же геометрической структуры. Просто нарисуйте шестиугольную сетку, а затем соедините центры смежных шестиугольников, чтобы найти ее треугольный эквивалент. Что касается высших измерений, то обобщением треугольника/тетраэдра является симплекс. - person salva; 21.06.2012

Чтобы быть ленивым, это можно привести к проблеме покрытия набора, с которой можно справиться с помощью решателя/оптимизаторов смешанных целочисленных задач. Вот модель GNU MathProg для решателя GLPK LP/MIP. Здесь C обозначает, какая точка может «удовлетворить» каждую точку.

param N, integer, > 0;
set C{1..N};

var x{i in 1..N}, binary;
s.t. cover{i in 1..N}: sum{j in C[i]} x[j] >= 1;
minimize goal: sum{i in 1..N} x[i];

При нормальном распределении 1000 точек он не нашел оптимальное подмножество за 4 минуты, но заявил, что знает истинный минимум, и выбрал только одну дополнительную точку.

person h2kyeong    schedule 26.09.2013