如何加上和减去像实数这样的概率分布?

时间:2011-06-07 20:11:56

标签: c# .net probability

我希望你的建议:你能推荐一个允许你像实数一样添加/减去/乘/除PDF(概率密度函数)的库吗?

在幕后,它必须使用蒙特卡罗才能完成结果,所以我可能更喜欢快速有效的东西,它可以利用系统中的任何GPU。

更新

这是我正在寻找的那种C#代码:

  var a = new Normal(0.0, 1.0); // Creates a PDF with mean=0, std. dev=1.0.
  var b = new Normal(0.0, 2.0); // Creates a PDF with mean=0, std. dev=2.0.
  var x = a + b; // Creates a PDF which is the sum of a and b.
                 // i.e. perform a Monte Carlo by taking thousands of samples 
                 // of a and b to construct the resultant PDF.

更新

我正在寻找的是Sam Savage在The Flaw of Averages中对“概率形状”实现代数的方法。视频Monte Carlo Simulation in Matlab解释了我想要的效果 - 一个用于对一系列输入分布执行数学运算的库。

更新

搜索以下内容将生成相应库的信息:

  • “monte carlo library”
  • “monte carlo C ++”
  • “monte carlo Matlab”
  • “monte carlo .NET”

3 个答案:

答案 0 :(得分:2)

@Risk Developer套件允许您从一组概率密度函数开始,然后对输入执行代数以获得一些输出,即P = A + B.

关键字on this page可用于查找其他竞争产品,例如尝试搜索:

  • “monte carlo simulation model C ++”
  • “monte carlo simulation model .NET”
  • “风险分析工具包”
  • “分发装修能力”。

用C ++或.NET等语言编写代码并不困难。蒙特卡罗部分可能只有大约50行代码:

  • 阅读Sam Savage的“The Flaw Of Averages”,了解如何在“概率形状”上使用代数。
  • 通过从某些采样数据引导,或从预先确定的概率密度函数,或使用Math.NET probability library,有一些生成“概率形状”的方法。
  • 从输入概率形状中取10000个样本。
  • 对样本进行代数处理,即+, - ,/,*等,以获得1000个输出。您还可以形成概率树,暗示输入上的和/或等。
  • 将这些10000个输出组合成一个新的“概率形状”,方法是将结果放入100个不连续的“桶”中。
  • 现在我们有一个新的“概率形状”,然后我们可以将其用作新概率树的输入,或者执行积分以获得该区域,该区域将其转换回给定某个阈值的硬概率数。
  • 视频Monte Carlo Simulation in Matlab比我更好地解释了整个过程。

答案 1 :(得分:1)

@Gravitas - 基于与@ user207442的交换,听起来你只想要一个对象进行抽象和减法的抽象。对于两个随机变量的乘积,肯定有一个封闭形式的解决方案,但它可能取决于分布。

C#炙手可热的新妹妹F#,让你做一些有趣的FP技术,它与C#无缝集成。你抽象出一个可以“求和”(卷积)或“乘法”(??)的“随机变量”类型的目标似乎是为a monad而尖叫。这是一个simple example

编辑:你需要在c#中重新发明mcmc吗?我们在学校使用winbugs ...这是winbugs使用的c ++库:http://darwin.eeb.uconn.edu/mcmc++/mcmc++.html。你可以将你的代码包裹在c ++周围而不是重新发明轮子(再次,看起来monad会在这里出现)吗?

答案 2 :(得分:0)

看一下Math.NET Numerics库。 Here是特定于概率分布支持的页面。