Поиск предложений для представления данных о распределении вероятностей - PullRequest
13 голосов
/ 20 марта 2012

Я ищу элегантный и эффективный способ представления и хранения произвольного распределения вероятностей, построенного с помощью явной выборки.

Ожидается, что распределение будет иметь следующие свойства:

  • Сэмплы являются значениями с плавающей запятой, но в принципе можно считать, что разрешение имеет значение до .001
  • Образцы взяты из интервала [-4000; 4000]
  • Однако для любых двух образцов a, b, |a - b| < 40
  • 90% времени, это будет иметь острый пик или несколько острых пиков, близких друг к другу
  • 10% времени, у него будет пик с неравномерным плато шириной от 0,5 до 5.

Обычное представление - массив гистограмм - нежелательно в основном из-за компромисса между квантованием / разрешением и пространством. Я предполагаю, что должен быть метод представления, который адаптивно изменяет размер корзины в зависимости от локальной "сложности".

Пространство вызывает беспокойство, потому что сеточная структура данных более высокого уровня будет содержать тысячи ячеек, каждая из которых содержит хотя бы одно такое вероятностное представление. Простая сериализация для передачи на диск или по сети желательна, но эффективность не является приоритетом.

Буду признателен за любую помощь.

Ответы [ 4 ]

5 голосов
/ 27 марта 2012

Интересная проблема. Вот предложение, которое может быть довольно сложно реализовать в зависимости от того, насколько вы математически склонны.

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

Во-первых, используйте функциональный подход. Распределение вероятностей - это мера вероятности:

struct Distribution
{
    virtual ~Distribution() {};
    virtual double integrate(std::function<double(double)>) = 0;
};

Таким образом, вы абстрагируетесь от образцов, которые вы производите, так как вы не хотите их хранить. Убедите себя в том, что вы можете делать практически все что угодно с помощью метода «интегрирования».

Конечно, с явными примерами вы делаете что-то вроде

struct SampledDistribution
{
    double integrate(std::function<double(double)> f)
    {
        double acc = 0;
        for (double x: samples) acc += f(samples);
        return acc / samples.size();
    }

    std::deque<double> samples;
};

Теперь часть хранения:

Обычное представление - массив гистограмм - в основном нежелательно из-за компромисса между квантованием / разрешением и пространством. я Представьте, что должен быть метод представления, который адаптивно варьирует размер корзины в зависимости от локальной "сложности".

Традиционный метод - вейвлеты . Вы производите коэффициенты с вызовами на integrate, которые вы можете сериализовать. Вы выбрасываете коэффициенты, если дисперсия интегральной оценки, которую они производят, высока.

Затем для десериализации вы создаете объект Distribution, метод которого integrate выполняет интеграцию с вейвлетами. Интеграция может быть выполнена с вашим любимым квадратурным методом. Я остаюсь здесь намеренно расплывчатым, потому что фактическая реализация зависит от выбранного вами семейства вейвлетов (гладкое, компактное, ортогональное или нет и т. Д.). Вам все равно придется погрузиться в литературу.

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

Кроме того, значение 0,001 является довольно большим числом: я подозреваю, что вам понадобится только несколько коэффициентов

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

Я бы предпочел вейвлеты, которые определены в области Фурье (например, вейвлеты Лемари), поскольку их значение и производные в нуле в пространстве Фурье известны, это позволяет вам применять ограничения на распределения: вероятностные меры должны интегрироваться в один, и вы можете заранее знать ожидаемое значение или отклонение.

Кроме того, вы можете изменить переменные, чтобы иметь дело только с функциями, например. на [0,1]. На вейвлетах в интервале много литературы.

1 голос
/ 27 марта 2012

Я бы настоятельно рекомендовал просмотреть все модели распространения, доступные в SciPy . Они наиболее интенсивно работают с этим вопросом, и любой предложенный мной алгоритм спецификации, который пытается решить проблему гранулярности разрешения, будет, по крайней мере, тангенциально рассмотренным.

Как уже упоминалось здесь , тем не менее, октри для многократно разрешенных данных выглядит как правильное представление желаемой структуры данных. Вместо плоской гистограммы, которая содержит данные, ограниченные вращающимися ячейками, ваша цель - сохранить возмущений в наборе данных с различными уровнями фиксированной детализации. Это наиболее похоже на алгоритм, используемый для сжатия JPEG , с дополнительным желанием извлечения выборок из распределения на некотором уровне детализации и сложности.

Для создания алгоритма классификации или дихотомайзера для заполнения структуры данных я настоятельно рекомендую рассмотреть алгоритмы декомпозиции, такие как JPEG 2000 , для определения формы и сложности. возмущений в данных. Другие подходы (например, ID3 и C4.5 ) также могут быть подходящими, но я чувствую, что простая векторизованная декомпозиция может работать для ваших целей.

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

1 голос
/ 20 марта 2012

Как насчет этого:

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

Теперь давайте построим аппроксимацию дляначнем с тривиальной гистограммы с одним сегментом, содержащим все выборки.

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

повторяется до тех пор, пока не будет достигнуто желаемое приближение или не будет получено максимальное количество допустимых сегментов.

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

Вам также нужен некоторый критерий, когда нужно остановиться.

Я думаю, что это на самом деле очень похоже на октри в 1D.Вы можете искать там эффективные реализации.

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

0 голосов
/ 03 марта 2015

Магазин n квантилей. Они будут адаптивно группироваться вокруг режимов.

Пусть n будет степенью 2, тогда поиск плотности (и кумулятивной вероятности) можно ограничить O (log (n)), сохраняя квантили как двоичное дерево медиан и "суб-медиан" рекурсивно.

...