2011-06-07 49 views
9

我希望你的建议:你能推荐一个库,允许你像实数一样添加/减去/乘/除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解释了我想要的效果 - 一个库来执行一系列输入分布的数学运算。

更新:

搜索以下将产生相应的库信息:

  • “蒙特卡洛库”
  • “蒙特卡洛C++”
  • “蒙特卡洛Matlab的“
  • ”monte carlo .NET“
+2

您的意思是:如果X和Y是带有PDF P和Q的随机变量,那么您需要X + Y,X-Y,X * Y和X/Y的PDF? (这不是你说的,但我想这就是你的意思。)你在说什么PDF的表示?他们代表代码?作为表?其他一些描述符? – sigfpe 2011-06-07 20:15:20

+0

是的,这是我想要的效果,但更通用,即一些库,它解析您指定的任何函数以生成输出概率密度函数。 PDF从一开始就是从现有采样数据引导的分布,或者是给出一些参数(即标准偏差为1.5的正态分布)手动生成的。 – Contango 2011-06-07 20:31:55

+0

在您提出这个问题之前,您需要能够精确地指定它。目前你似乎没有具体的规格。 – 2011-06-07 22:11:34

回答

2

@Risk Developer工具允许你开始用一组概率密度函数,然后对输入代数得到一些输出,即P = A + B.

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

  • “蒙特卡罗模拟模型的C++”
  • “蒙特卡罗模拟模型的.NET”
  • “风险分析工具”
  • “分发安装capabilties”。

在C++或.NET等语言中编写代码并不是那么困难。蒙特卡罗部分大概只有50行代码:

  • 读“The Flaw Of Averages”由山姆·萨维奇明白你怎么能在“概率形状”用代数。
  • 有一些产生“概率形状”的方法,可以通过从一些采样数据或从预先确定的概率密度函数进行自举,或者使用Math.NET probability library
  • 从输入概率形状中取出10000个样本。
  • 对样本进行代数运算,即+, - ,/,*等,以获得1000个输出。你也可以形成一个概率树,这意味着和,或者等等对输入。
  • 将这10000个输出组合成一个新的“概率形状”,将结果放入100个离散“桶”中。
  • 现在我们有了一个新的“概率形状”,然后我们可以使用它作为新概率树的输入,或者执行积分以获得区域,该区域在给定某个阈值时将其转换回硬概率数。
  • 视频Monte Carlo Simulation in Matlab解释了整个过程比我能更好地解释。
0

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

+0

这个库允许你创建概率密度函数。然而,我正在寻找的是添加和减去这些概率密度函数的能力,这是Math.NET不支持的。 – Contango 2011-06-07 23:57:47

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将在这里出现)?

+1

但是实际的实现将如何? – svick 2011-06-08 16:59:28

+0

我所要做的就是抽取卷积不仅仅是加法或减法,而是对于任意具有一些随机变量作为输入的公式。如果我们正在处理非标准分布或非标准代数(当你计算一个随机变量时,它的概率分布是什么?),那么蒙特卡罗就是一个通用的解决方案,它只是起作用(尽管代价是CPU多于非蒙特卡洛解决方案)。 – Contango 2011-06-09 08:30:38

+0

@svick我会尝试在F#中创建一个monad(ish?)示例,如果这会提供信息。 – egbutter 2011-06-09 16:24:35