2

我想子类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

我可以看到它scipy.stats正在做某种奇怪的事情,其中norm​​是某物的特定实例(某种类型?),但它不是普通的类定义,所以我看不到如何为它调用构造函数。

编辑#2:scipy 版本可能是相关的。

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

2 回答 2

2

scipy.stats.norm不是一个类。它是 的一个实例scipy.stats.norm_gen。调用将返回一个withnorm(*args, **kwds)的实例和你给它的参数。如果你想要一种新的冻结分布,子类来添加你的方法,然后用参数实例化它。不用担心子类化。rv_frozennormrv_frozennormnorm_gen

于 2013-07-31T16:53:42.283 回答
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

希望这可以帮助...

编辑:

您所指的奇怪行为似乎是“规范”类也可以用作函数。他们在文档中称其为 rv_frozen 对象

这里有一段关于子类化的内容,希望能有所帮助。rv_continuous 模块不能用作函数,也许这是正确的方法!

于 2013-07-31T16:15:42.620 回答