2016-09-14 42 views
1

我嘗試定義與PDF定製分佈經由scipy.stats定製分佈PDF給出

import numpy as np 
from scipy.stats import rv_continuous 

class CustomDistribution(rv_continuous): 
    def __init__(self, pdf=None): 
     super(CustomDistribution, self).__init__() 
     self.custom_pdf = pdf 
     print "Initialized!" 

    def _pdf(self, x, *args): 
     if self.custom_pdf is None: 
      # print 'PDF is not overridden' 
      return super(CustomDistribution, self)._pdf(x, *args) 
     else: 
      # print 'PDF is overridden' 
      return self.custom_pdf(x) 

def g(x, mu): 
    if x < 0: 
     return 0 
    else: 
     return mu * np.exp(- mu * x) 

my_exp_dist = CustomDistribution(pdf=lambda x: g(x, .5)) 
print my_exp_dist.mean() 

正如所看到的我嘗試定義指數分佈wuth參數畝= 0.5給定,但輸出如下。

初始化!

d:\ Anaconda2 \ LIB \站點包\ SciPy的\集成\ quadpack.py:357:

IntegrationWarning:該算法不收斂。在外插表中檢測到四捨五入錯誤 。假定 要求的公差不能達到,並且返回的結果 (如果full_output = 1)是最好的可以獲得的。
warnings.warn(MSG,IntegrationWarning)

d:\ Anaconda2 \ lib中\站點包\ SciPy的\整合\ quadpack.py:357:

IntegrationWarning:細分的最大數目(50)具有取得了 。

2.0576933609

如果增加限制產量沒有改善,建議將 分析積,以確定的困難。如果 可以確定局部難度的位置(奇點, 不連續性),則可能通過拆分間隔並在子範圍上調用積分器來獲益。也許應該使用專用集成商 。 warnings.warn(msg, IntegrationWarning)

我應該怎麼做才能改善這一點?

NOTE:計算精度問題在this GitHub issue中討論。

回答

1

這似乎是做你想做的。每次創建實例時,都必須爲該類的實例給出lambda參數的值。 rv_continuous足夠聰明地推斷你不提供的項目,當然,你可以提供更多的定義。

from scipy.stats import rv_continuous 
import numpy 

class Neg_exp(rv_continuous): 
    "negative exponential" 
    def _pdf(self, x, lambda): 
     self.lambda=lambda 
     return lambda*numpy.exp(-lambda*x) 
    def _cdf(self, x, lambda): 
     return 1-numpy.exp(-lambda*x) 
    def _stats(self,lambda): 
     return [1/self.lambda,0,0,0] 

neg_exp=Neg_exp(name="negative exponential",a=0) 

print (neg_exp.pdf(0,.5)) 
print (neg_exp.pdf(5,.5)) 

print (neg_exp.stats(0.5)) 

print (neg_exp.rvs(0.5)) 
+0

但如何在實例構造函數中使用_custom_ pdf? –

+0

你不應該那樣做,因爲當你定義_pdf或_cdf時,如果你沒有定義_rvs,軟件使用你提供的函數簽名來獲得其他信息,它需要定義諸如rvs之類的方法。您需要每個pdf/cdf的rv_continuous的一個子類(需要參數)。 –

+0

這正是我所需要的 - 我想要軟件使用我自定義的pdf來自動計算其他方法。順便說一句,爲什麼我的代碼不正確地計算指數分佈的期望? –