Подтвердить что ты не робот

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

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

Аналитическое решение невозможно, поэтому я ищу некоторое представление PDF файлов, которые позволяют такие вещи. Очевидным (но вычислительно дорогостоящим) решением является monte-carlo: генерировать множество значений 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 == [email protected]
      cBars :: [Double]
      -- ^ Boundaries of the bars.  @length cBars == cN + [email protected]
    } deriving (Show, Read)


{- | Add distributions.  If two random variables @[email protected] and @[email protected] are
taken from distributions @[email protected] and @[email protected] 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

Другие операторы остаются в качестве упражнения для читателя.

4b9b3361

Ответ 1

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

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

Распределение вероятностей действительно codata​​strong > .

Пусть 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 от эмпирической меры, полученной, например. MC выборки. Также

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.

Ответ 2

Вероятностные распределения образуют монаду; см., например, работу работы Claire Jones, а также документ LICS 1989, но идеи восходят к статье 1982 года Гири (DOI 10.1007/BFb0092872) и к заметке 1962 года Лоувери, которую я не могу отследить (http://permalink.gmane.org/gmane.science.mathematics.categories/6541).

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

Ответ 3

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

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


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


Гистограмма - это всего лишь массив, содержимое которого представляет собой заболеваемость в конкретной области входного диапазона. Вы не сказали, если у вас есть языковые предпочтения, поэтому я буду считать что-то c-like. Вам нужно знать структуру бина (размеры 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[];
};

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

Несколько ответов:

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, например. нормальное распределение, то вы можете использовать уже определенные функции для определения суммы и т.д.

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

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

Ответ 7

Некоторые исходные мысли:

Во-первых, 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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

Павел.