在SciPy中创建自定义概率分布以从中绘制随机样本

8
我想使用蒙特卡罗模拟方法对任意数量的概率分布进行求和。我想要随机抽样连续分布,并将它们与其他连续分布的随机样本相加,最终得到它们组合的概率分布。这些分布本身是经验性的,它们不是函数,而是以P99 = 2.4、P90 = 7.12、P50 = 24.53、P10 = 82.14等形式存在(实际上有很多这样的点)。这些分布或多或少是对数正态分布,因此如果必要的话,将它们近似为对数正态分布可能是可以接受的。但是,如何将其输入到SciPy的lognorm function中呢?或者在SciPy或Python中用其他方法实现呢?
希望我的意思已经表达清楚。
谢谢, Alex
1个回答

3

看起来你拥有的基本上是概率密度的直方图。那么你可以使用反变换抽样和你的经验分布。

另一种选择是,如果你期望某种特定的分布函数形式(例如对数正态分布或其他分布),你可以尝试用相应的函数形式拟合数据。


嗯,我确实希望它们接近对数正态分布,你知道我该如何将数据拟合到这个分布上吗?在描述页面中,我不知道如何使对数正态分布通过两个给定点。如果我的P90是X,而P10是Y,我该如何制作适合这两个点的对数正态分布? - Alex S
我不确定你所说的这个双点问题。我的做法是,首先检查分布是否确实是对数正态分布。为此,我会利用正态分布的矩应该以非常精确的方式相关联的事实(参见维基百科、数学世界或其他地方),并且如果 X 是对数正态分布,则 log X 是正态分布:只需计算 log X 的前几个矩即可。 - ev-br
好的,但是我不需要将它加载到scipy对象中,这样我就可以按照上面lognorm函数页面中所提到的使用R = lognorm.rvs(s, size=100)获取随机样本了吗? - Alex S
是的。等到你确信你的分布是对数正态分布,并且已经估算好了它的参数,那当然没问题。 - ev-br
没错,但这就是我不知道如何做的。假设我确实有对数正态分布数据(有时我肯定会有),我该如何将它们加载到scipy对象中?我需要计算一个x和一个s来加载它吗?如果需要,那么我如何计算这些值,因为我只有上面提到的一组数字?也许“两点”问题与此有关——在半对数图上绘制时,累积概率函数呈直线状。我知道该直线上足够多的点以适合一个公式。但我该如何将其放入SciPy中? - Alex S
@Zhenya 即使这个答案没有被接受,感谢你的见解!! - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接