使用scipy从自定义分发创建样本

Vin*_*ntN 1 python distribution scipy

我试图从给定的分布中获取一些样本,事实上,它是一个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)
Run Code Online (Sandbox Code Playgroud)

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

我不太清楚如何解决这个问题.如果有人有任何建议,将不胜感激.

先感谢您.

编辑:

我现在已经改变了代码,但它一直给出负值.

import scipy.stats as stats
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")
pare3 = pareto3.rvs(alpha = 5,lambd = 4,k = 2)
print(pare3)
Run Code Online (Sandbox Code Playgroud)

如果我尝试将其简化为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)
Run Code Online (Sandbox Code Playgroud)

Ein*_*r A 5

你必须从scipy.special而不是scipy.stats导入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)
Run Code Online (Sandbox Code Playgroud)