Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy多项式pmf返回nan_Python_Matlab_Scipy_Multinomial - Fatal编程技术网

Python scipy多项式pmf返回nan

Python scipy多项式pmf返回nan,python,matlab,scipy,multinomial,Python,Matlab,Scipy,Multinomial,我试图使用scipy.stats(python)中的multinominal.pmf函数 当我使用这个函数时,输入中的所有概率都大于零,它工作得很好。问题是当一个概率为零时,我想使用这个函数 下面的例子说明了我的意思: In [18]: multinomial.pmf([3, 3, 0], 6, [1/3.0, 1/3.0, 1/3.0]) Out[18]: 0.027434842249657095 In [19]: multinomial.pmf([3, 3, 0], 6, [2/3.0,

我试图使用
scipy.stats
(python)中的
multinominal.pmf
函数

当我使用这个函数时,输入中的所有概率都大于零,它工作得很好。问题是当一个概率为零时,我想使用这个函数

下面的例子说明了我的意思:

In [18]: multinomial.pmf([3, 3, 0], 6, [1/3.0, 1/3.0, 1/3.0])
Out[18]: 0.027434842249657095

In [19]: multinomial.pmf([3, 3, 0], 6, [2/3.0, 1/3.0, 0])
Out[19]: nan
可以看出,在第一次所有概率都大于0的情况下,使用该函数没有问题。但是,当我将其中一个概率更改为零时,函数返回
nan
,即使通过函数也应返回
0.21948

在python中,当一个概率为零时,有没有一种方法可以计算pmf?或者是可以处理它的另一种方法,或者是该函数的解决方法

其他信息


示例中的函数应该返回的值是我在matlab中使用mnpdf函数计算的。然而,由于我的其余代码是用python编写的,所以我更喜欢用python来计算它。

很好!这是scipy中的一个bug。可以找到源代码

第3031至3051行:

def pmf(self, x, n, p):
    return np.exp(self.logpmf(x, n, p))
第2997至3017行:

def logpmf(self, x, n, p):
    n, p, npcond = self._process_parameters(n, p)
第2939至2958行:

def _process_parameters(self, n, p):

    p = np.array(p, dtype=np.float64, copy=True)
    p[...,-1] = 1. - p[...,:-1].sum(axis=-1)

    # true for bad p
    pcond = np.any(p <= 0, axis=-1)  # <- Here is why!!!
    pcond |= np.any(p > 1, axis=-1)

    n = np.array(n, dtype=np.int, copy=True)

    # true for bad n
    ncond = n <= 0

    return n, p, ncond | pcond
结果是
logpmf
pmf
返回
nan

注意,实际结果计算正确(第30202994-2995行):

用你的价值观:

import numpy as np
from scipy.special import xlogy, gammaln

x = np.array([3, 3, 0])
n = 6
p = np.array([2/3.0, 1/3.0, 0])

result = np.exp(gammaln(n+1) + np.sum(xlogy(x, p) - gammaln(x+1), axis=-1))
print(result)

>>>0.219478737997

那看起来像个虫子。您能在上为这个问题创建一个问题吗?(点击绿色的“新问题”按钮。)是的,我现在就做。很棒的分析。如果您有时间,可以将此信息添加到列表中吗?
result = self._logpmf(x, n, p)

def _logpmf(self, x, n, p):
    return gammaln(n+1) + np.sum(xlogy(x, p) - gammaln(x+1), axis=-1)
import numpy as np
from scipy.special import xlogy, gammaln

x = np.array([3, 3, 0])
n = 6
p = np.array([2/3.0, 1/3.0, 0])

result = np.exp(gammaln(n+1) + np.sum(xlogy(x, p) - gammaln(x+1), axis=-1))
print(result)

>>>0.219478737997