表示连续概率分布

时间:2008-12-28 08:40:11

标签: algorithm math haskell statistics probability

我有一个涉及连续概率分布函数集合的问题,其中大多数是凭经验确定的(例如出发时间,运输时间)。我需要的是一些方法来获取这些PDF中的两个并对它们进行算术运算。例如。如果我有两个值x取自PDF X,而y取自PDF Y,我需要获取(x + y)的PDF或任何其他操作f(x,y)。

分析解决方案是不可能的,所以我正在寻找的是PDF的一些表示,允许这样的事情。一个明显的(但计算上很昂贵的)解决方案是monte-carlo:生成大量的x和y值,然后测量f(x,y)。但这需要太多的CPU时间。

我确实考虑将PDF表示为范围列表,其中每个范围的概率大致相等,有效地将PDF表示为统一分布列表的并集。但我看不出如何将它们结合起来。

有没有人对此问题有任何好的解决方案?

编辑:目标是创建一种用于处理PDF的迷你语言(又称域特定语言)。但首先我需要理清基础表示和算法。

编辑2: dmckee建议直方图实施。这就是我对统一分布列表的看法。但我不知道如何将它们组合起来创建新的发行版。最终,我需要在可能非常小的情况下找到像P(x

编辑3:我有一堆直方图。它们不是均匀分布的,因为我是根据出现数据生成的,所以基本上如果我有100个样本并且我想在直方图中有10个点,那么我会为每个条分配10个样本,并使条形变宽但是恒定区域。 / p>

我已经想出要添加PDF,你就可以对它们进行卷积,而且我已经对数学进行了剔除。当您对两个均匀分布进行卷积时,您会得到一个包含三个部分的新分布:更宽的均匀分布仍然存在,但是每边都有一个三角形贴在较窄边的宽度上。因此,如果我对X和Y的每个元素进行卷积,我会得到一堆这些,都是重叠的。现在我想弄清楚如何将它们全部相加,然后得到一个最接近它的直方图。

我开始怀疑蒙特卡洛毕竟不是一个坏主意。

编辑4: This paper详细讨论了统一分布的卷积。一般来说,你得到一个“梯形”分布。由于直方图中的每个“列”是均匀分布,我曾希望通过卷积这些列并对结果求和来解决问题。

然而,结果比输入复杂得多,并且还包括三角形。 编辑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

其他操作员留给读者练习。

10 个答案:

答案 0 :(得分:16)

不需要直方图或符号计算:如果采用正确的观点,一切都可以在封闭的形式在语言层面完成。

[我将互换使用术语“措施”和“分配”。另外,我的Haskell生锈了,我请你原谅我在这方面不精确。]

概率分布实际上是 codata

让mu成为概率测量。您可以对度量进行唯一的操作是将其与测试函数集成(这是“度量”的一种可能的数学定义)。请注意,这是您最终将要执行的操作:例如,针对身份进行集成取决于:

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

另一个例子:

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

另一个例子,其计算P(mu

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)

因此,如果采取两种措施,您可以对其卷积进行整合。

另外,给定法律mu的随机变量X,a * X的定律由下式给出:

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

此外,在我们的框架中,phi(X)的分布由image measure phi_ * X给出:

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

现在,您可以轻松地为嵌套语言制定措施。这里还有很多事情要做,特别是关于除实线之外的样本空间,随机变量之间的依赖关系,条件,但我希望你明白这一点。

特别是,前推是有趣的:

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

它也是一个monad(运动 - 暗示:这看起来像是延续monad。什么是returncall/cc的模拟是什么?)。

此外,结合微分几何框架,这可能会变成自动计算贝叶斯后验分布的东西。

在一天结束时,你可以写一些像

这样的东西
m = mean $ apply cos ((from_pdf gauss) ** (empirical data))

计算cos(X + Y)的平均值,其中X具有pdf gauss并且Y已经由结果在data中的MC方法采样。

答案 1 :(得分:6)

概率分布形成一个单子;参见例如work of Claire Jones以及LICS 1989年的论文,但这些想法可以追溯到Giry(DOI 10.1007 / BFb0092872)的1982年论文和Lawvere的1962年的一篇文章,我无法追踪(http://permalink.gmane.org/gmane.science.mathematics.categories/6541 )。

但是我没有看到comonad:没有办法从“(a-&gt; Double) - &gt; Double”中获得“a”。也许如果你把它变成多态 - (a-&gt; r) - &gt; r对所有r? (那是继续monad。)

答案 2 :(得分:2)

有没有什么可以阻止你使用迷你语言?

我的意思是,定义一种语言,让您编写f = x + y并为您评估f。同样适用于g = x * zh = y(x) ad nauseum 。 (我建议的语义要求评估者在评估时在RHS上出现的每个最里面的PDF上选择一个随机数,而不是试图理解生成的PDF的堆肥形式。这可能不够快。 。)


假设您了解所需的精度限制,您可以使用直方图或样条函数相当简单地表示PDF(前者是后者的简并情况)。如果您需要将经过分析定义的PDF与实验确定的PDF混合使用,则必须添加类型机制。


直方图只是一个数组,其内容表示输入范围的特定区域的发生率。你还没有说过你是否有语言偏好,所以我会假设有类似c的东西。你需要知道bin结构(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[];
};

这种事情在科学分析软件中很常见非常,你可能想要使用现有的实现。

答案 3 :(得分:2)

我为论文研究过类似的问题。

计算近似卷积的一种方法是对密度函数进行傅里叶变换(在这种情况下为直方图),将它们相乘,然后进行逆傅立叶变换以得到卷积。

关于概率分布的各种特殊操作案例的公式,请参阅我的论文附录C.您可以在http://riso.sourceforge.net

找到论文

我编写了Java代码来执行这些操作。您可以在https://sourceforge.net/projects/riso

找到代码

答案 4 :(得分:1)

自主移动机器人在本地化和导航中处理类似的问题,特别是Markov localizationKalman filter(传感器融合)。例如,请参阅An experimental comparison of localization methods continued

您可以从移动机器人借用的另一种方法是使用潜在字段进行路径规划。

答案 5 :(得分:1)

一些回复:

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

我认为定义自己的迷你语言等是过度的。你可以用数组做到这一点......

答案 6 :(得分:1)

一些初步想法:

首先,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

答案 7 :(得分:1)

我认为直方图或1 / N区域列表是一个好主意。为了论证,我假设你将为所有发行版都有一个固定的N.

使用链接编辑4的纸张生成新分发。然后,用新的N元素分布近似它。

如果你不想修复N,那就更容易了。在新生成的分布中取每个凸多边形(梯形或三角形)并以均匀分布逼近它。

答案 8 :(得分:1)

另一个建议是使用kernel densities。特别是如果你使用高斯内核,那么它​​们可以相对容易地工作......除了分布很快就会大小爆炸而不用小心。根据应用程序的不同,可以使用其他近似技术,如importance sampling

答案 9 :(得分:0)

如果你想要一些乐趣,试着像Maple或Mathemetica那样象征性地表现它们。 Maple使用有向无环图,而Matematica使用list / lisp就像appoach(我相信,但这是一个漫长的时间,因为我甚至想过这个)。

以符号方式执行所有操作,然后在最后推送数值。 (或者只是找到一种在shell中启动并进行计算的方法)。

保罗。