我正在尝试使用multinominal.pmf
(python)中的scipy.stats
函数。
当我使用此函数时输入中的所有概率大于零,它工作正常。问题是当我想要在其中一个概率为零时使用该函数时。
以下示例显示了我的意思:
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中计算它的方法。
答案 0 :(得分:4)
好地方!这是scipy中的一个错误。可以找到源代码here。
第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
如果pcond = np.any(p <= 0, axis=-1)
的任何值<&lt; = 0,则行pcond
会导致true
为p
。
然后在logpmf
第3029行:
return self._checkresult(result, npcond_, np.NAN)
会导致logpmf
和pmf
返回nan
!
请注意,实际结果是正确计算的(第3020行,2994-2995行):
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