使用 scipy 从自定义分布创建样本
Creating sample from custom distribution using scipy
我试图从给定的分布中获取一些样本,事实上,它是一个 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 instead of scipy.stats 导入 gamma。
原因是scipy.stats.gamma is distribution and 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)
正如我所写 您的发行版在 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))
打印
2.0134570579012108
2.0
足够接近了。 (当然,随机样本的均值是随机的。)
我试图从给定的分布中获取一些样本,事实上,它是一个 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 instead of scipy.stats 导入 gamma。
原因是scipy.stats.gamma is distribution and 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)
正如我所写 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))
打印
2.0134570579012108
2.0
足够接近了。 (当然,随机样本的均值是随机的。)