3

在 python3 中,scipy 的 stats.rv_discrete 函数要求概率的总和为 1,但由于浮点数在内存中的表示,总和不是 1。

幸运的是 scipy 安装在我的主目录中,所以我能够注释掉检查 ~.local/lib/python3.7/site-packages/scipy/stats/_distn_infrastructure.py 文件中总和的“if”行,因此让它工作。但是当这段代码要在另一个系统中运行时该怎么办。将文件复制到工作目录并导入会导致太多错误。从头开始的自定义代码(使用列表)似乎效率很低。

if len(xk) != len(pk):
    raise ValueError("xk and pk need to have the same length.")
#if not np.allclose(np.sum(pk), 1):
    #raise ValueError("The sum of provided pk is not 1.")

我希望得到一个从头开始的有效功能或适当的解决方法。

4

1 回答 1

2

您可以标准化 pk 的值,以避免错误。这将“强制”概率之和等于 1。

前:

from scipy import stats
xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.19) 
custm = stats.rv_discrete(name='custm', values=(xk, pk))

错误:ValueError:提供的 pk 的总和不是 1。

后:

from scipy import stats
xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.19)
pk_norm = tuple(p/sum(pk) for p in pk)
custm = stats.rv_discrete(name='custm', values=(xk, pk_norm))

结果:好的

于 2019-05-02T15:29:43.480 回答