如何在Scipy中实现对数均匀分布?

5

我不明白如何在Scipy中实现对数均匀概率分布。根据这篇文章的评论,可以通过仅定义_pdf来实现。同时,我从这个来源了解到实际的概率密度函数(pdf)推导。

然而,我无法确定应该放置ab参数以及如何设置a>0。同时,请注意我希望ab是范围内实际的最小值和最大值。最后,请注意,我真的只想能够使用.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')
1个回答

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参数修改底数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接