Алгоритм выбора внешних точек на графе (богатая выпуклая оболочка)

Я ищу эффективный способ выбора относительно большой части точек (двумерный евклидовый график), которые находятся дальше всего от центра. Это напоминает выпуклую оболочку, но будет включать (намного) больше точек. Дополнительные критерии:

  • Количество точек в выборке/наборе ("K") должно быть в пределах указанного диапазона. Скорее всего, он не будет очень узким, но лучше всего подходит для разных диапазонов (например, 0,01*N ‹ K ‹ 0,05*N, а также 0,1*N ‹ K ‹ 0,2*N).

  • Алгоритм должен уметь сбалансировать расстояние от центра и «локальную плотность». Если вблизи верхней части диапазона графика имеются плотные области, а вблизи нижней части — разреженные, то алгоритм должен обеспечить выбор некоторых точек из нижней части, даже если они находятся ближе к центру, чем точки в верхней части. область, край. (см. пример ниже)

  • Бонус: вместо простого расстояния от центра было бы идеально учитывать расстояние до конкретной точки (или до точки и до центра).

До сих пор мои попытки были сосредоточены на использовании «сортировки по голубям» (разделение графика на блоки CxR, назначение точек блокам на основе координат) и выборе «внешних» блоков до тех пор, пока у нас не будет достаточно точек в наборе. Однако мне не удалось ни сбалансировать выбор (плотные области чрезмерно выбраны из-за фиксированного размера поля), ни использовать выбранную точку в качестве ссылки вместо (только) центра.

Я (плохо) нарисовал Пример: красные точки — это точки, зеленая фигура — пример того, что я хочу (снаружи зеленый = выбрано). Для разреженных областей ограничивающая форма приближается к центру, чтобы найти подходящие точки (но не обязательно находит их, если они находятся слишком близко к центру). Желтая рамка — это пример того, что делают мои алгоритмы на основе Pigeon Holing. Даже при попытке приспособиться к более разреженным регионам это не срабатывает.

Приветствуются любые идеи!


person Gaminic    schedule 21.11.2013    source источник


Ответы (1)


Я не думаю, что есть какие-то стандартные алгоритмы, которые дадут вам то, что вы хотите. Вам придется проявить творческий подход. Предполагая, что ваши точки встроены в двумерное евклидово пространство, вот несколько идей:

  1. Итеративно вычислить несколько выпуклых оболочек. Например, вычислить выпуклую оболочку, сохранить точки, являющиеся частью выпуклой оболочки, а затем вычислить другую выпуклую оболочку, игнорируя точки исходной выпуклой оболочки. Продолжайте делать это до тех пор, пока у вас не будет достаточного количества точек, по сути, выщипывая точки по периметру для каждой итерации. Единственная проблема с этим подходом заключается в том, что он не будет хорошо работать для вогнутостей в вашем наборе данных (например, в нижней части вашего образца, который вы разместили).

  2. Сопоставьте гауссиан с вашими данными и держите все > N стандартных отклонений от среднего (где N — значение, которое вам нужно выбрать). Это должно работать очень хорошо, если ваши данные являются гауссовыми. Если это не так, вы всегда можете смоделировать его с помощью нескольких гауссиан (вместо одного) и оставить точки с общей вероятностью меньше некоторого порога. Использование нескольких гауссианов, вероятно, позволит прилично обрабатывать вогнутости.
    Ссылки:
    http://en.wikipedia.org/wiki/Gaussian_function
    Как подогнать гауссиану к данным в matlab/octave?\

  3. Используйте Оценку плотности ядра. Если вы создаете поверхность плотности ядра, вы можете разрезать поверхность на некоторой высоте (например, превратив ее в плато), получив форму периметра. (форма плато) вокруг точек. Хитрость заключается в том, чтобы разрезать его в нужном месте, потому что вы можете не получить никаких точек за пределами фигуры, но при правильном выборе вы можете легко получить зеленую фигуру, которую нарисовали. Этот подход будет работать хорошо и даст вам зеленую форму в вашем примере, если вы правильно выберете точку среза (что может быть трудно сделать). Большим недостатком этого подхода является то, что он требует больших вычислительных ресурсов. Дополнительная информация: http://en.wikipedia.org/wiki/Multivariate_kernel_density_estimation

  4. Используйте альфа-фигуры, чтобы получить общую форму, плотно огибающую внешний периметр набора точек. Затем немного размойте форму, чтобы вытеснить некоторые точки за пределы формы. У меня нет большого опыта работы с альфа-формами, но этот подход также будет довольно затратным в вычислительном отношении. Дополнительная информация: http://doc.cgal.org/latest/Alpha_shapes_2/index.html

person mattnedrich    schedule 21.11.2013
comment
Оба они выглядят довольно дорогими с точки зрения вычислений. Любое представление о сложности обоих методов? - person Gaminic; 22.11.2013
comment
Да, вы правы - подходы KDE и альфа-формы очень затратны в вычислительном отношении. Я добавил несколько дополнительных идей. - person mattnedrich; 22.11.2013
comment
Спасибо; очень интересные идеи. Я собираюсь хорошенько рассмотреть каждого и посмотреть, смогу ли я придумать эвристический способ использования их сильных сторон. - person Gaminic; 25.11.2013
comment
Вы нашли хороший способ сделать это? - person Liwellyen; 11.04.2018