scipy 的 stats.rv_discrete 模块中 'sum pk not equal to 1' 错误的解决方法

Workaround for 'sum pk not equal to 1' error in scipy's stats.rv_discrete module

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

幸运的是 scipy 安装在我的主目录中,所以我能够注释掉 'if' 行检查 ~.local/lib/python3.7/[=22 中的总和=].py 文件,从而使其工作。但是当这段代码在另一个系统中是运行时怎么办。将文件复制到工作目录并导入它会导致太多错误。从头开始自定义代码(使用列表)似乎非常低效。

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.")

我希望得到一个从头开始的高效函数或适当的解决方法。

您可以将 pk 的值归一化以避免错误。这将"force"概率之和等于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))

结果:好的