如何根据给定的连续概率密度函数生成随机变量?

问题描述 投票:0回答:1

我试图根据三个不同的概率密度函数生成随机变量。其中两个函数是缩放正态分布,分别为

µ = 260/3, σ = 100/3, scaled by 1.53666351546
µ = 854/9, σ = 100/3, scaled by 1.78979465778
,第三个函数是十一个不同正态分布和两个半正态分布的总和。

我尝试对前两个分布的

numpy.random.randn
函数进行转换,但我无法让数学保持一致。我还没有为第三个发行版尝试任何东西,因为我什至不知道从哪里开始。

使用 sato 在 this Question 中创建的代码,我能够使用 Peter O. 的答案对其进行修改,以获得我的第一个发行版的以下代码:

from decimal import Decimal
from scipy import stats
import numpy

Q = Decimal(0.0460999054638)/((Decimal(2)*Decimal(numpy.pi))**Decimal(0.5))

class Distribution_B(stats.rv_continuous):
    def _pdf(self, x):
        return (Q*Decimal(numpy.exp(-(((Decimal(260)-Decimal(3)*Decimal(x))**Decimal(5))/Decimal(20000)))))

distribution = Distribution_B(a = 0, b = 100)
distribution.rvs()

但是,当我运行代码时,遇到了以下错误:

Warning (from warnings module):
  File "[numpy function_base library]", line 2411
    outputs = ufunc(*inputs)
RuntimeWarning: invalid value encountered in _cdf_single (vectorized)

编辑:我运行了代码,除了变量名称之外没有更改任何内容,而且似乎错误只是有时发生。

python random normal-distribution probability-density
1个回答
0
投票
from decimal import Decimal
from scipy import stats
import numpy as np

Q = Decimal(0.0460999054638) / ((Decimal(2) * Decimal(np.pi)) ** Decimal(0.5))

class Distribution_B(stats.rv_continuous):
    def _pdf(self, x):
        x = float(x)  # Convert x to float
        return Q * Decimal(np.exp(-(((Decimal(260) / Decimal(3) - Decimal(x)) ** Decimal(2)) / (2 * (Decimal(100) / Decimal(3)) ** Decimal(2)))))

distribution = Distribution_B(a=0, b=100)
samples = distribution.rvs(size=1000)

记得调整下一行的大小

© www.soinside.com 2019 - 2024. All rights reserved.