我正在一篇名为A Neural Bayesian Estimator for Conditional Probability Densities的论文的上下文中实现一些变量的预处理。
它说: 1.)给定非线性,单调变量F:t-> s,使得s均匀分布。这可以通过以下方式在论文中提到:
>>> sorting the target vector in ascending order
>>> fitting the spline to data, e.g. using interpolate from scipy
2。)之后s被缩放到介于-1和1之间。这可以通过interp
实现:
>>> from numpy import interp
>>> interp(256,[1,512],[5,10])
3.)最后,平面分布需要转换为高斯分布,以std 1为中心。
虽然前两步明确如何实施,但我正在与第三步挣扎。
关于3.),作者进一步指出可以使用积分X ^ 2(X ... chi)函数的逆。是否有适合这项工作的图书馆,最好是Python?
更新1:
再次阅读论文后,似乎X ^ 2与chi没有直接关系,而是计算如下:
X ^ 2 = P *(1-o)^ 2 +(1-P)*(( - 1)-o)^ 2
以P
为纯度(可以通过给定变量轻松计算)和o
变量本身。
对于给定的s缩放在-1和1之间,我可能只计算了下限= -1和上限= s的积分,然后得到它的倒数。
问题:如何以数字方式做到这一点?
答案 0 :(得分:1)
如果您的意思是X {sup> 2 分布为PDF here,那么您所看到的是X 2 CDF。它通过不完整的Gamma函数表示,参见相同的参考,您可以使用SciPy来计算它,this或that应该符合条件。不要忘记分母中的完整Gamma函数。
要查找不完整Gamma的反转,您可以从SciPy查看反函数:this或that。
因此,我不相信你需要所有这些插值的东西
更新
可以使用在线集成商分析计算该表达式 比如that。只需计算上限的resulat和下限的结果之间的差异,然后设置
更新II
你必须自己设定间隔
下面是您可能尝试使用的(绝对未经测试的!)代码。注意,我使用泛型 根寻找例程,虽然因为积分是多项式,更优化的方式可能 是使用here的多项式根,甚至是 自己编码 - 它只是一个cubic equation
_
更新III
变量mkdir -p "$d" && cp "$1" "$d"
被定义为从0到1的某个(随机U(0,1))数字。
def intgrl(x):
return x*(x*(3.0 + x - 6.0*p) + 3.0)/3.0
def CDF(x, norm):
return (intgrl(x) - intgrl(-1.0))/norm
def f(x, norm, rn):
return CDF(x, norm) - rn
norm = intgrl(1.0) - intgrl(-1.0)
rn = 0.12345
res = scipy.optimize.brentq(f, -1.0, 1.0, args=(norm, rn))