как выбрать подмножество точек с обычной плотностью? Более формально,
Дано
- набор A неравномерно расположенных точек,
- метрика расстояния
dist
(например, евклидово расстояние), - и целевая плотность 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 двумерных точек, распределенных равномерно или по стандартному нормальному распределению. Затем я попробовал с ними методы «сверху вниз» и «снизу вверх». И вот что я получил:
RC красный, RE синий. Ось X — количество выбранных точек. Вы думали, что «снизу вверх» может быть так же хорошо? Я так и думал, глядя на анимацию, но кажется, что сверху вниз значительно лучше (посмотрите на разреженную область). Тем не менее, не так уж ужасно, учитывая, что это намного быстрее.
Вот и упаковал все.
http://www.filehosting.org/file/details/352267/density_sampling.tar.gz
for every x in A there is an y in B such that dist(x, y) < d
) в предоставленном вами коде. Я также не могу найти пакет pythonh2
, который вы используете. - person salva   schedule 18.06.2012h2
это моя коллекция повторно используемых фрагментов кода... Я не знал, что использовал его. - person h2kyeong   schedule 02.07.2012