【问题标题】:Overflow error subclassing a distribution using scipy.stats.rv_continuous使用 scipy.stats.rv_continuous 对分布进行子类化的溢出错误
【发布时间】:2021-03-28 03:35:39
【问题描述】:

In the documentation page of rv_continuous 我们可以找到一个“自定义”高斯被子类化如下。

from scipy.stats import rv_continuous
import numpy as np

class gaussian_gen(rv_continuous):
    "Gaussian distribution"
    def _pdf(self, x):
        return np.exp(-x**2 / 2.) / np.sqrt(2.0 * np.pi)
gaussian = gaussian_gen(name='gaussian')

反过来,我尝试为以 2 为底的指数分布创建一个类,以模拟一些核衰变:

class time_dist(rv_continuous):
    def _pdf(self, x):
        return 2**(-x)
    
random_var = time_dist(name = 'decay')

这样做的目的是调用random_var.rvs(),以便根据我定义的pdf生成随机分布的值样本。但是,当我运行它时,我收到一个 OverflowError,我不太明白为什么。最初我认为这与函数未标准化这一事实有关。但是,我一直对 _pdf 定义进行更改,但无济于事。代码有什么问题,还是这种方法不适合定义此类函数?

【问题讨论】:

标签: python-3.x scipy scipy.stats


【解决方案1】:

根据维基百科,pdf of an exponential distribution 将是:

  • lambda * exp(-lambda*x)x >= 0
  • 0x < 0

所以,大概功能应该改成如下:

from scipy.stats import rv_continuous
import numpy as np
import matplotlib.pyplot as plt

class time_dist(rv_continuous):
    def _pdf(self, x):
        return np.log(2) * 2 ** (-x) if x >= 0 else 0

random_var = time_dist(name='decay')
plt.hist(random_var.rvs(size=500))
plt.show()

【讨论】:

  • 这行得通,谢谢。由于这也继承了scaleloc args,我可以进一步自定义它的半衰期。
猜你喜欢
  • 2017-07-21
  • 2014-09-22
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2019-09-29
  • 2014-07-22
相关资源
最近更新 更多