首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多项pmf返回nan

多项pmf返回nan
EN

Stack Overflow用户
提问于 2017-12-19 20:07:33
回答 1查看 656关注 0票数 5

我正在尝试使用来自multinominal.pmf (python)的scipy.stats函数。

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

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

代码语言:javascript
复制
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中找到一种计算方法。

EN

回答 1

Stack Overflow用户

发布于 2017-12-19 21:19:35

好地方!这是枕骨中的一个虫子。源代码可以找到这里

第3031至3051行:

代码语言:javascript
复制
def pmf(self, x, n, p):
    return np.exp(self.logpmf(x, n, p))

第2997至3017行:

代码语言:javascript
复制
def logpmf(self, x, n, p):
    n, p, npcond = self._process_parameters(n, p)

第2939至2958行:

代码语言:javascript
复制
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)的任何值为<= 0,则行p的结果是true

然后在logpmf第3029行:

代码语言:javascript
复制
return self._checkresult(result, npcond_, np.NAN)

结果logpmfpmf返回nan

请注意,实际结果是正确计算的(第3020、2994-2995行):

代码语言:javascript
复制
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)

用你的价值观:

代码语言:javascript
复制
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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47894446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档