在这个例子中,我使用了函数multivariable_normal.cdf两次,得到了两个不同的结果。结果很接近,但仍然不同。每次使用该函数时,是否可以进行任何调整以获得完全相同的结果
import numpy as np
from scipy.stats import multivariate_normal
def normal_cdf_3d(d_1, d_2, d_3, correl_1_2, correl_1_3, correl_2_3):
mean = np.array([0, 0, 0])
cov = np.array(
[
[1, correl_1_2, correl_1_3],
[correl_1_2, 1, correl_2_3],
[correl_1_3, correl_2_3, 1],
]
)
x = np.array([d_1, d_2, d_3])
y = multivariate_normal(mean=mean, cov=cov).cdf(x=x)
return y
d_1_ = -0.2304886114323222
d_2_ = -0.1479019945774904
d_3_ = 0.525
correl_1_2_ = 0.5500190982169267
correl_1_3_ = 0.9219544457292886
correl_2_3_ = 0.5916079783099616
a = normal_cdf_3d(
d_1=d_1_,
d_2=d_2_,
d_3=d_3_,
correl_1_2=correl_1_2_,
correl_1_3=correl_1_3_,
correl_2_3=correl_2_3_,
)
b = normal_cdf_3d(
d_1=d_1_,
d_2=d_2_,
d_3=d_3_,
correl_1_2=correl_1_2_,
correl_1_3=correl_1_3_,
correl_2_3=correl_2_3_,
)
print(a)
print(b)
if a == b:
print(True)
else:
print(False)
# Results
# 0.2698170436763295 (a)
# 0.2698184075101584 (b)
# False
由于CDF必须在多维空间中通过数值积分计算,因此
multivariate_normal
对象具有相对较低的相对和绝对收敛容差。另外,积分要考虑的点数是默认的{{CD2}},在这种情况下是^ {CD3}}。增加点数和减小公差将以牺牲性能为代价获得更好的精度。请记住,Python中浮点数的默认精度为1e-17
这并没有很好的时间伸缩性。如果可能的话,再尝试几次增加点数,直到获得相同的输出
根据最近3次运行,计算的可用精度存在限制。您可以只使用“在某个ε内”作为相同的数字是可以接受的,即使它小于Python的精度
相关问题 更多 >
编程相关推荐