使用scipy从自定义分发创建示例

2024-04-25 09:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个给定的分布中得到一些样本,事实上,它是一个3参数的Pareto分布。代码如下:

from scipy.stats import gamma, rv_continuous

class pareto3_pdf(rv_continuous):
    def _pdf(self,x,alpha,lambd,k):
        return (gamma(alpha + k) * lambd**alpha * x**(k - 1)) / (gamma(alpha) * gamma(k) * (lambd + x)**(alpha + k))
pareto3 = pareto3_pdf(name="pareto")


x = pareto3.rvs(alpha = 3,lambd = 4,k = 2)
print(x)

以及输出:TypeError: unsupported operand type(s) for *: 'rv_frozen' and 'int'

我不太确定该怎么解决这个问题。如果有人有任何建议,将不胜感激。在

提前谢谢你。在

编辑:

我现在已经修改了代码,但是它总是给出负值。在

^{pr2}$

如果我试图将其简化为一个2参数模型,OverflowError: (34, 'Result too large')错误弹出。在

import scipy.stats as stats
from scipy.stats import rv_continuous
from scipy.special import gamma

class pareto2_pdf(rv_continuous):
    def _pdf(self,x,alpha,lambd):
        return (alpha * lambd**alpha / (lambd + x)**(alpha + 1))
pareto2 = pareto2_pdf(name="pareto2")
pare2 = pareto2.rvs(alpha = 2,lambd = 2)
print(pare2)

Tags: 代码fromimportalpha参数pdfstatsscipy
2条回答

必须从scipy.special而不是{a2}导入gamma。
原因是scipy.stats.gamma是分布,scipy.special.gamma是伽马函数。在

from scipy.stats import rv_continuous 
from scipy.special import gamma 

class pareto3_pdf(rv_continuous):
    def _pdf(self,x,alpha,lambd,k):
        return (gamma(alpha + k) * lambd**alpha * x**(k - 1)) /(gamma(alpha) * gamma(k) * (lambd + x)**(alpha + k))
pareto3 = pareto3_pdf(name="pareto")
x = pareto3.rvs(alpha = 3,lambd = 4,k = 2)

正如我所写的elsewhere,您的发行版在SciPy中作为betaprime(k, alpha, scale=lamda)提供,因此抽样是内置的。小测试:

from scipy.stats import betaprime
alpha, lamda, k = 5, 4, 2
sample = betaprime.rvs(k, alpha, scale=lamda, size=1000)
print(sample.mean())
print(betaprime.mean(k, alpha, scale=lamda))

印刷品

^{pr2}$

够近了。(当然,随机样本的平均值是随机的。)

相关问题 更多 >