Skip to main content
 首页 » 编程设计

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

2025年05月04日20linjiqin

我试图从给定的分布中获取一些样本,事实上,它是一个 3 参数帕累托分布。以下是代码:

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'

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

提前谢谢你。

编辑:

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

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) 

如果我尝试将其简化为一个 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) 

请您参考如下方法:

您必须从 scipy.special 导入 Gamma 而不是 scipy.stats .
原因是 scipy.stats.gamma是分布和scipy.special.gamma是 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)