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))
结果:好的
在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))
结果:好的