我不明白如何在Scipy中实现对数均匀概率分布。根据{{3}}的评论,可以通过仅定义_pdf
来实现。另外,我从this post知道了pdf的实际推导。
但是,我无法确定将a
和b
参数放在何处,以及如何将a
设置为a>0
。另请注意,我希望a
和b
成为范围的实际最小值和最大值。还请注意,最后,我真的只是希望能够使用.rvs()
方法,因此任何统一分布的技巧都是可以接受的。
这是我的解密(非工作)代码:
from scipy.stats import rv_continuous
import numpy as np
class log_uniform_gen(rv_continuous):
"Log-uniform distribution"
def _pdf(self, x):
if np.exp(self.a) <= x <= np.exp(self.b):
temp = x / (self.b - self.a)
else:
temp = 0.
return temp
log_uniform = log_uniform_gen(a=0.1, b=1.0, name='log-uniform')
答案 0 :(得分:7)
以下是使用.rvs()
方法获取对数均匀分布实例的技巧:
import numpy as np
import scipy as sp
class log_uniform():
def __init__(self, a=-1, b=0, base=10):
self.loc = a
self.scale = b - a
self.base = base
def rvs(self, size=None, random_state=None):
uniform = sp.stats.uniform(loc=self.loc, scale=self.scale)
if size is None:
return np.power(self.base, uniform.rvs(random_state=random_state))
else:
return np.power(self.base, uniform.rvs(size=size, random_state=random_state))
可以使用log_uniform(a=2, b=10).rvs(size=10)
调用它,其中a
是范围开头的指数,b
是范围结束的指数。可以使用base
参数修改基数。