Tensorflow Probability中Normal分布CDF低于PDF值的异常问题咨询
TensorFlow Probability Normal分布计算结果异常排查
我在测试Tensorflow Probability的部分用例时遇到异常。回溯后发现,至少在Normal分布中,取值0.9568...对应的PDF值为7.69...e-22,而CDF值仅为7.621...e-24,这在理论与实际场景中均不可能。请问该异常的可能原因是什么?
相关代码:
import tensorflow_probability as tfp tfd = tfp.distributions tfb = tfp.bijectors dist = tfd.Normal(loc=1.0, scale=0.1) print('sample :', dist.sample(3).numpy()) #Samples 3 numbers print('prob :',dist.prob((0,1,2)).numpy()) #Calculates the probabilities for positions 0,1,2 print('log_prob :',dist.log_prob((0,1,2)).numpy()) #Same as above just log print('cdf :',dist.cdf((0,1,2)).numpy()) #Calculates the cummulative distributions print('mean :',dist.mean().numpy()) #Returns the mean of the distribution print('stddev :',dist.stddev().numpy())
运行结果:
sample : [0.95685613 1.0321676 1.1132953 ] prob : [7.6946093e-22 3.9894230e+00 7.6946093e-22] log_prob : [-48.616352 1.3836466 -48.616352 ] cdf : [7.619853e-24 5.000000e-01 1.000000e+00] mean : 1.0 stddev : 0.1
异常原因排查
- 核心误解:混淆了样本值与概率计算的输入值:你代码中
dist.prob((0,1,2))和dist.cdf((0,1,2))是计算x=0、x=1、x=2这三个点的PDF和CDF值,而非你生成的样本[0.95685613, 1.0321676, 1.1132953]对应的概率。 - 数值合理性验证:你的Normal分布参数是
loc=1.0, scale=0.1,x=0与均值的差为10个标准差((0-1)/0.1 = -10),对于正态分布,如此极端的尾部值对应的PDF和CDF本身就是极小的,这和你得到的结果完全匹配,属于正常数学结果,并非库的异常。 - 正确计算样本对应概率的方式:若要计算生成样本的PDF和CDF,需将样本作为参数传入,修改代码如下:
samples = dist.sample(3).numpy() print('sample prob:', dist.prob(samples).numpy()) print('sample cdf:', dist.cdf(samples).numpy())
运行后会得到符合预期的结果,比如样本0.95685613距离均值约-0.43个标准差,对应的CDF约0.33,PDF约3.6,完全符合正态分布的特性。
内容的提问来源于stack exchange,提问作者Ignacio Ojeda Aguirre
相关产品推荐
相关产品推荐

