2013-07-31 7 views
2

scipy.stats.norm의 하위 클래스로 추가 기능이 포함 된 고정 된 배포 (즉, 특정 수단/분산) 인스턴스를 가질 수 있습니다. 그러나 인스턴스를 작성하는 첫 번째 단계는 지나갈 수 없습니다.scipy.stats.norm을 서브 클래 싱하는 방법은 무엇입니까?

편집 : 여기에 내 문제를 보여줍니다 대화 형 세션의 사본입니다

In [1]: import scipy.stats 

In [2]: class A(scipy.stats.norm): 
    ...:  def __init__(self): 
    ...:   super(A, self).__init__() 
    ...:   
    ...:   
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

/home/Dave/src/python2.7/density_estimation/<ipython console> in <module>() 

/usr/lib64/python2.7/site-packages/scipy/stats/distributions.pyc in __init__(self, momtype, a, b, xa, xb, xtol, badvalue, name, longname, shapes, extradoc) 
    958 
    959   if longname is None: 
--> 960    if name[0] in ['aeiouAEIOU']: 
    961     hstr = "An " 
    962    else: 

TypeError: Error when calling the metaclass bases 
    'NoneType' object is not subscriptable 

내가 norm은을이다 scipy.stats이 이상한 것은 일종의을하고있는 것을 볼 수있다 (아무것도까지 내 소매 없다) 특정 인스턴스 (뭔가?),하지만 그것은 일반적인 클래스 정의가 아니므로, 나는 그것에 대한 생성자를 호출하는 방법을 볼 수 없습니다.

편집 # 2 : scipy 버전이 적합 할 수 있습니다.

In [19]: scipy.__version__ 
Out[19]: '0.9.0' 

답변

2

scipy.stats.norm은 클래스가 아닙니다. scipy.stats.norm_gen의 인스턴스입니다. norm(*args, **kwds)을 호출하면 rv_frozen의 인스턴스가 norm으로 반환되고 지정한 인수가 반환됩니다. 새로운 종류의 동결 된 배포판을 원하면 rv_frozen 하위 클래스를 추가하여 메서드를 추가하고 norm 및 인수를 사용하여 인스턴스화하면됩니다. norm_gen 서브 클래 싱에 대해서는 걱정하지 마십시오.

+0

왜'rv_frozen' 대신'rv_continuous'를 하위 클래스로 만들지 않겠습니까? –

+0

import 명령은 다음과 같습니다 :'from scipy.stats.distributions import rv_frozen' 그리고 초기 호출은'super (className, self) .__ init __ (norm, normprop1, normprop1 ...)'과 같습니다. –

1

나는이 오류가 보이지 않는 곳의 어딘가에 있다고 생각하는 경향이 있습니다. 클래스 자체에는 문제가 없어야합니다. 사실 :

class GaussianKernel(scipy.stats.norm): 
def __init__(self, mu, sigma): 
    super(GaussianKernel, self).__init__(loc=mu, scale=sigma) 

G = GaussianKernel(5,.2) 
G.mean() # returns 5 
G.std() # returns .2 

그러나, scipy를 사용하는 경우, 하나는 전화를해야한다는 사실이다 :

from scipy.stats import norm 

대신 :이 도움이

import scipy.stats.norm 

희망 ...

편집 :

당신이 말하는 이상한 행동은 'norm'클래스가 또한 함수로 사용될 수있는 것처럼 보입니다. 그들은 docs에있는 rv_frozen 객체를 호출합니다.

어떤 도움이 될만한 here의 서브 클래 싱에 대한 단락이 있습니다. rv_continuous 모듈을 함수로 사용할 수 없습니다. 아마도 올바른 방법입니다.

+0

Nope; 내 슬리브에 아무것도 없습니다. 편집을 참조하십시오. – Dave

+0

ipython에서 편집 한 것과 똑같은 라인을 시도했지만 오류가 없습니다. 나는 더 이상 도움을 줄 수있는 자격이 없지만 내가 너라면 scipy (0.12.0을 사용) 버전을 살펴볼 것입니다. 또한 내 편집 좀 봐. 나는 그것이 당신을 위해 잘되기를 바랍니다. – cenna75

+0

한 가지 더 : scipy.stats.distributions.norm_gen이라는 수퍼 클래스를 사용해보십시오! – cenna75

관련 문제