【问题标题】:Fitting custom distribution scipy.stats gives overflow拟合自定义分布 scipy.stats 会溢出
【发布时间】:2021-06-01 06:27:34
【问题描述】:

我正在尝试将广义误差分布拟合到我拥有的一些数据中。分布形式为

我尝试了以下实现

import numpy as np
import scipy.stats as st
from scipy.special import gamma

class ged(st.rv_continuous):

    def _pdf(self, x, mu, sigma, kappa):
        
        term1 = gamma(3*kappa)/gamma(kappa)
        
        exponent = (term1 * ((x - mu)/sigma)**2)**(1/(2*kappa))
        
        term2 = np.exp(-exponent)
        
        term3 = 2*sigma*gamma(kappa+1)
        
        fx = term1**0.5 * term2/term3

        return fx

ged_inst = ged(name='ged')
data = np.random.normal(size=1000)
ged_inst.fit(data, 0, 0.01, 1)

但是这给了

OverflowError: (34, 'Numerical result out of range')

如何正确实施此分发?我正在尝试拟合真实数据(不是问题中生成的玩具正常数据)

【问题讨论】:

  • 我相信你必须定义_argcheck。查看stackoverflow.com/questions/66122645/… 以了解正确的自定义分发
  • 是的,谢谢
  • 你可以把它作为一个答案,我赞同它
  • 好主意,我已经做到了

标签: numpy scipy distribution scipy.stats


【解决方案1】:

正如 cmets 中所发布的,为了使这项工作能够正常工作,我需要覆盖默认的 _argcheck 函数。以下作品:

class ged(st.rv_continuous):

    def _pdf(self, x, mu, sigma, kappa):
        
        term1 = gamma(3*kappa)/gamma(kappa)
        
        exponent = (term1 * ((x - mu)/sigma)**2)**(1/(2*kappa))
        
        term2 = np.exp(-exponent)
        
        term3 = 2*sigma*gamma(kappa+1)
        
        fx = term1**0.5 * term2/term3

        return fx
    
    def _argcheck(self, mu, sigma, kappa):
        
        s = sigma > 0
        k = kappa < 1
        
        return s and k

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多