Представление непрерывных распределений вероятностей

У меня проблема, связанная с набором непрерывных функций распределения вероятностей, большинство из которых определяется эмпирически (например, время отправления, время прохождения). Мне нужен способ взять два из этих PDF-файлов и произвести с ними арифметические операции. Например. если у меня есть два значения x, взятые из PDF X, и y, взятые из PDF Y, мне нужно получить PDF для (x + y) или любой другой операции f (x, y).

Аналитическое решение невозможно, поэтому я ищу какое-то представление PDF-файлов, которое позволяет такие вещи. Очевидное (но затратное в вычислительном отношении) решение - это метод Монте-Карло: сгенерировать множество значений x и y, а затем просто измерить f (x, y). Но это отнимает слишком много процессорного времени.

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

Есть ли у кого-нибудь хорошие решения этой проблемы?

Редактировать: Цель состоит в том, чтобы создать мини-язык (также известный как язык предметной области) для управления PDF-файлами. Но сначала мне нужно разобраться в базовом представлении и алгоритмах.

Изменить 2: dmckee предлагает реализацию гистограммы. Это то, к чему я пришел со своим списком однородных распределений. Но я не вижу, как их объединить для создания новых дистрибутивов. В конечном итоге мне нужно найти такие вещи, как P (x <y), в тех случаях, когда это может быть довольно мало.

Изменить 3: У меня куча гистограмм. Они не распределяются равномерно, потому что я генерирую их из данных о происшествиях, поэтому в основном, если у меня есть 100 выборок и мне нужно десять точек на гистограмме, я выделяю 10 выборок на каждую полосу и делаю полосу переменной ширины, но постоянной площадью.

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

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

Изменить 4:Эта бумага обсуждает свертки однородных распределений более подробно. В целом получается "трапециевидное" распределение. Поскольку каждый «столбец» в гистограммах представляет собой равномерное распределение, я надеялся, что проблема может быть решена путем свертки этих столбцов и суммирования результатов.

Однако результат значительно сложнее, чем входные данные, и также включает треугольники. Изменить 5: [Неправильный материал удален]. Но если эти трапеции аппроксимировать прямоугольниками с той же площадью, вы получите правильный ответ, и уменьшение количества прямоугольников в результате тоже выглядит довольно просто. Возможно, это решение, которое я пытался найти.

Изменить 6: Решено! Вот окончательный код Haskell для этой проблемы:

-- | Continuous distributions of scalars are represented as a
-- | histogram where each bar has approximately constant area but
-- | variable width and height.  A histogram with N bars is stored as
-- | a list of N+1 values.
data Continuous = C {
      cN :: Int,
      -- ^ Number of bars in the histogram.
      cAreas :: [Double],
      -- ^ Areas of the bars.  @length cAreas == cN@
      cBars :: [Double]
      -- ^ Boundaries of the bars.  @length cBars == cN + 1@
    } deriving (Show, Read)


{- | Add distributions.  If two random variables @vX@ and @vY@ are
taken from distributions @x@ and @y@ respectively then the
distribution of @(vX + vY)@ will be @(x .+. y).

This is implemented as the convolution of distributions x and y.
Each is a histogram, which is to say the sum of a collection of
uniform distributions (the "bars").  Therefore the convolution can be
computed as the sum of the convolutions of the cross product of the
components of x and y.

When you convolve two uniform distributions of unequal size you get a
trapezoidal distribution. Let p = p2-p1, q - q2-q1.  Then we get:


>   |                              |
>   |     ______                   |
>   |     |    |           with    |  _____________
>   |     |    |                   |  |           |
>   +-----+----+-------            +--+-----------+-
>         p1   p2                     q1          q2
> 
>  gives    h|....... _______________
>            |       /:             :\
>            |      / :             : \                1
>            |     /  :             :  \     where h = -
>            |    /   :             :   \              q
>            |   /    :             :    \
>            +--+-----+-------------+-----+-----
>             p1+q1  p2+q1       p1+q2   p2+q2

However we cannot keep the trapezoid in the final result because our
representation is restricted to uniform distributions.  So instead we
store a uniform approximation to the trapezoid with the same area:

>           h|......___________________
>            |     | /               \ |
>            |     |/                 \|
>            |     |                   |
>            |    /|                   |\
>            |   / |                   | \
>            +-----+-------------------+--------
>               p1+q1+p/2          p2+q2-p/2

-}
(.+.) :: Continuous -> Continuous -> Continuous
c .+. d = C {cN     = length bars - 1,
             cBars  = map fst bars, 
             cAreas = zipWith barArea bars (tail bars)}
    where
      -- The convolve function returns a list of two (x, deltaY) pairs.
      -- These can be sorted by x and then sequentially summed to get
      -- the new histogram.  The "b" parameter is the product of the
      -- height of the input bars, which was omitted from the diagrams
      -- above.
      convolve b c1 c2 d1 d2 =
          if (c2-c1) < (d2-d1) then convolve1 b c1 c2 d1 d2 else convolve1 b d1 
d2 c1 c2
      convolve1 b p1 p2 q1 q2 = 
          [(p1+q1+halfP, h), (p2+q2-halfP, (-h))]
               where 
                 halfP = (p2-p1)/2
                 h = b / (q2-q1)
      outline = map sumGroup $ groupBy ((==) `on` fst) $ sortBy (comparing fst) 
$ concat
                [convolve (areaC*areaD) c1 c2 d1 d2 |
                 (c1, c2, areaC) <- zip3 (cBars c) (tail $ cBars c) (cAreas c),
                 (d1, d2, areaD) <- zip3 (cBars d) (tail $ cBars d) (cAreas d)
                ]
      sumGroup pairs = (fst $ head pairs, sum $ map snd pairs)

      bars = tail $ scanl (\(_,y) (x2,dy) -> (x2, y+dy)) (0, 0) outline
      barArea (x1, h) (x2, _) = (x2 - x1) * h

Остальные операторы оставлены читателю в качестве упражнения.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
0
3 290
10

Ответы 10

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

Под этим я подразумеваю определение языка, который позволяет вам писать f = x + y и оценивает f для вас так же, как написано. Аналогично для g = x * z, h = y(x) и т.д. до тошноты. (Семантика, которую я предлагаю, требует, чтобы оценщик выбирал случайное число для каждого самого внутреннего PDF-файла, появляющегося в RHS во время оценки, и не пытался понять составную форму результирующих PDF-файлов. Это может быть недостаточно быстро ... .)


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


Гистограмма - это просто массив, содержимое которого представляет собой частоту в определенной области входного диапазона. Вы не сказали, есть ли у вас языковые предпочтения, поэтому я предполагаю что-то вроде c. Вам нужно знать структуру бункера (размеры uniorm просты, но не всегда лучше), включая верхний и нижний пределы и, возможно, нормализацию:

struct histogram_struct {
  int bins; /* Assumed to be uniform */
  double low;
  double high;
  /* double normalization; */    
  /* double *errors; */ /* if using, intialize with enough space, 
                         * and store _squared_ errors
                         */
  double contents[];
};

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

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

Paul Johnson 28.12.2008 11:55

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

dmckee --- ex-moderator kitten 28.12.2008 11:58

Я хочу знать, что такое составные PDF-файлы. В конечном итоге мне нужно уметь определять такие вещи, как P (x <y).

Paul Johnson 28.12.2008 12:24

> Вы можете довольно просто представить PDF-файл с помощью гистограммы. Да. Вы знаете какие-нибудь алгоритмы для этого.

Paul Johnson 28.12.2008 12:27

:: ищет способ спасти эту идею :: Эээ, ммм. Как насчет кластера. Ага, нужен кластер ...

dmckee --- ex-moderator kitten 28.12.2008 12:28

Автономная мобильная робототехника решает аналогичные проблемы в локализации и навигации, в частности Марковская локализация и Фильтр Калмана (сочетание датчиков). См., Например, Продолжено экспериментальное сравнение методов локализации..

Другой подход, который вы могли бы позаимствовать у мобильных роботов, - это планирование пути с использованием потенциальных полей.

Если вы хотите немного повеселиться, попробуйте изобразить их символически, как это сделали бы Maple или Mathemetica. Maple использует направленные ациклические графы, в то время как Matematica использует list / lisp как appoach (я думаю, но это было давно, раз уж я даже подумал об этом).

Проделайте все свои манипуляции символически, а затем в конце протолкните числовые значения. (Или просто найдите способ запустить в оболочке и выполнить вычисления).

Павел.

Пара отзывов:

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

2) Предположим, что переменные независимы. Затем, если вы сделаете PDF дискретным, тогда P (f (x, y)) = f (x, y) p (x, y) = f (x, y) p (x) p (y), просуммированный по всем комбинациям x и y таким образом, что f (x, y) соответствует вашей цели.

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

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

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

Некоторые начальные мысли:

Во-первых, в Mathematica есть прекрасная возможность делать это с точными распределениями.

Во-вторых, представление в виде гистограмм (т. Е. Эмпирических PDF-файлов) проблематично, поскольку вам нужно сделать выбор в отношении размера ячейки. Этого можно избежать, сохранив вместо этого кумулятивное распределение, т. Е. Эмпирическую CDF. (Фактически, тогда вы сохраняете возможность воссоздать полный набор данных выборок, на которых основано эмпирическое распределение.)

Вот какой-то уродливый код Mathematica, который берет список выборок и возвращает эмпирическую CDF, а именно список пар значение-вероятность. Запустите вывод этого через ListPlot, чтобы увидеть график эмпирической CDF.

empiricalCDF[t_] := Flatten[{{#[[2,1]],#[[1,2]]},#[[2]]}&/@Partition[Prepend[Transpose[{#[[1]], Rest[FoldList[Plus,0,#[[2]]]]/Length[t]}&[Transpose[{First[#],Length[#]}&/@ Split[Sort[t]]]]],{Null,0}],2,1],1]

Наконец, вот некоторая информация о сочетании дискретных распределений вероятностей:

http://www.dartmouth.edu/~chance/teaching_aids/books_articles/probability_book/Chapter7.pdf

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

Paul Johnson 29.12.2008 22:18

Я думаю, что гистограммы или список областей 1 / N - это хорошая идея. В качестве аргумента я предполагаю, что у вас будет фиксированное N для всех дистрибутивов.

Используйте документ, который вы связали с редакцией 4, чтобы создать новое распространение. Затем аппроксимируйте его новым распределением N-элементов.

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

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

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

[Я буду использовать термины «мера» и «распределение» как синонимы. Кроме того, мой Haskell заржавел, и я прошу вас простить меня за неточность в этой области.]

Распределения вероятностей действительно кодата.

Пусть mu - вероятностная мера. Единственное, что вы можете сделать с мерой, - это интегрировать ее с тестовой функцией (это одно из возможных математических определений «меры»). Обратите внимание, что вы в конечном итоге будете делать именно это: например, интеграция с идентичностью означает следующее:

mean :: Measure -> Double
mean mu = mu id

другой пример:

variance :: Measure -> Double
variance mu = (mu $ \x -> x ^ 2) - (mean mu) ^ 2

другой пример, который вычисляет P (mu <x):

cdf :: Measure -> Double -> Double
cdf mu x = mu $ \z -> if z < x then 1 else 0

Это предполагает подход двойственности.

Следовательно, тип Measure должен обозначать тип (Double -> Double) -> Double. Это позволяет моделировать результаты моделирования MC, числовую / символьную квадратуру относительно PDF и т. д. Например, функция

empirical :: [Double] -> Measure
empirical h:t f = (f h) + empirical t f

возвращает интеграл от f против эмпирическая мера, полученного, например. Отбор проб МК. Также

from_pdf :: (Double -> Double) -> Measure
from_pdf rho f = my_favorite_quadrature_method rho f

построить меры из (регулярных) плотностей.

А теперь хорошие новости. Если mu и nu - две меры, сверткаmu ** nu определяется как:

(mu ** nu) f = nu $ \y -> (mu $ \x -> f $ x + y)

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

Кроме того, учитывая случайную величину X закона mu, закон a * X задается следующим образом:

rescale :: Double -> Measure -> Measure
rescale a mu f = mu $ \x -> f(a * x)

Кроме того, в нашей структуре распределение phi (X) задается мера изображения phi_ * X:

apply :: (Double -> Double) -> Measure -> Measure
apply phi mu f = mu $ f . phi

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

В частности, pushforward является функториальным:

newtype Measure a = (a -> Double) -> Double
instance Functor Measure a where
    fmap f mu = apply f mu

Это тоже монада (упражнение - подсказка: это очень похоже на монаду продолжения. Что такое return? Какой аналог call/cc?).

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

В конце концов, вы можете написать что-нибудь вроде

m = mean $ apply cos ((from_pdf gauss) ** (empirical data))

для вычисления среднего значения cos (X + Y), где X имеет pdf gauss, а Y был выбран методом MC, результаты которого находятся в data.

Это невероятно интересно.

jtobin 31.10.2012 02:40

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

jtobin 18.10.2013 02:32

@jtobin: Отлично, я посмотрю!

Alexandre C. 18.10.2013 11:06

Особенно интересно отметить, что (>> =) является байесовский вывод. Т.е. priorMeasure >>= likelihoodMeasure дает апостериорную прогностическую меру.

jtobin 19.10.2013 14:55

На всякий случай, если кто-нибудь прочитает мой вышеупомянутый комментарий и запутается: я слишком поспешно пришел к такому выводу. Bind на самом деле является интегрирующим оператором в том смысле, что priorMeasure >>= likelihoodMeasure дает прогнозирующее распределение прежний. Апостериорное прогнозирование естественным образом следует примеру, когда вы проходите задний вход, но >>= не обрабатывает задний за вас автоматически.

jtobin 06.11.2013 11:47

Как с помощью этого метода построить идеальные дистрибутивы, такие как uniform или gauss? вы не можете легко интегрировать их с общей функцией тестирования.

user47376 14.11.2017 15:33

@ user47376: У вас есть много вариантов. Если вы ограничиваетесь сглаженными функциями, вы можете использовать числовую квадратуру (например, Гаусс-Эрмит или Гаусс-Лежандр, или что-то менее конкретное) или даже выборку Монте-Карло.

Alexandre C. 15.11.2017 22:01

Распределения вероятностей образуют монаду; см., например, работа Клэр Джонс, а также статью LICS 1989 года, но идеи восходят к статье Гири 1982 года (DOI 10.1007 / BFb0092872) и к заметке Ловера 1962 года, которую я не могу отследить (http://permalink.gmane.org/gmane.science.mat Mathematics.categories/6541).

Но я не вижу комонады: нет возможности получить «а» из «(a-> Double) -> Double». Возможно, если вы сделаете его полиморфным - (a-> r) -> r для всех r? (Это монада продолжения.)

Я работал над аналогичными проблемами в своей диссертации.

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

В приложении C к моей диссертации можно найти формулы для различных частных случаев операций с вероятностными распределениями. Вы можете найти диссертацию по адресу: http://riso.sourceforge.net

Я написал код Java для выполнения этих операций. Вы можете найти код по адресу: https://sourceforge.net/projects/riso

Другие вопросы по теме