【问题标题】:How to implement a log uniform distribution in Scipy?如何在 Scipy 中实现日志均匀分布?
【发布时间】:2018-09-07 08:27:00
【问题描述】:

我不明白如何在 Scipy 中实现对数均匀概率分布。根据this post 的cmets,可以通过只定义_pdf 来实现。另外,我从this source 知道 pdf 的实际推导。

但是,我不知道将ab 参数放在哪里,以及如何设置a 这样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')

【问题讨论】:

    标签: python python-3.x scipy scikit-learn


    【解决方案1】:

    这是我使用.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 参数修改基数。

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 1970-01-01
      • 2012-10-11
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2011-04-04
      • 2016-07-09
      • 2011-06-23
      相关资源
      最近更新 更多