微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将使用Tensorflow概率的插值函数获得的双射函数求逆

如何解决将使用Tensorflow概率的插值函数获得的双射函数求逆

我从密度中获得了一组值,我将其转换为累积密度函数(CDF),并且我正在尝试评估在这些值下评估的另一个CDF的倒数。

具体来说,给定一组代表密度的值g和另一组代表密度的值f,我希望评估g的反CDF(表示为G的CDF上的f(表示为F)。因此在tensorflow中:

import tensorflow as tf

F = tf.cumsum(f)
G = tf.cumsum(g)

我要评估的是G ^ {-1}(F)。

可以使用scipy.interpolate.interp1d在scipy中非常简单地完成此操作,其中t是用于评估密度f值的支撑元素:

import numpy as np
import scipy.interpolate as interp

F = np.cumsum(f)
G = np.cumsum(g)

inv_G = interp.interp1d(x = G,y = t,bounds_error = False,fill_value = (t[0],t[-1])

inv_G_applied_to_F = inv_G(F) 

据我所知,tensorflow没有插值函数,但是tensorflow_probability(here)中只有一个

此插值函数是不同的,因为与给它定义范围的插值函数的域上的值相反,您给它提供x_ref_minx_ref_max自变量并构造这些长度为y_ref的值之间的线性网格。这不适用于我的问题,因为在这种情况下,我的领域是非线性网格,而我的范围是线性网格(分别为Gt)。

一个参数可以将网格转换为非线性空间grid_regularizing_transform,因此我尝试使用该参数,并将一个lambda函数内插G作为转换:

import tensorflow as tf
from tensorflow_probability import math as tfpm

F = tf.cumsum(f)
G = tf.cumsum(g)

transform_fun = lambda loc: tfpm.interp_regular_1d_grid(x = loc,x_ref_min = t[0],x_ref_max = t[-1],y_ref = G,fill_value_below=tf.constant(0.0,dtype=tf.float64),fill_value_above=tf.constant(1.0,dtype=tf.float64)) 
    
    
inv_G_applied_to_F = tfpm.interp_regular_1d_grid(x = F,x_ref_min = 0,x_ref_max = t.shape[0],y_ref = t,fill_value_below = t[0],fill_value_above = t[-1],grid_regularizing_transform = transform_fun)

这不起作用,因为如果您查看链接页面上的示例,则需要transform函数的逆函数才能将变换应用于网格(它们使用tf.log来获得指数网格) ,但反之则是我们想要获得的。最终得到的是G(F)而不是G ^ {-1}(F)。

任何关于如何执行此操作的输入都将受到极大的赞赏,甚至可以理解为什么tensorflow插值函数不同于scipy函数,因此我对为什么这样做有一个更好的直觉。我对tensorflow_probability中的双射手的概念很熟悉,也许我可以使用其中的一些东西来简化此工作。

(顺便说一句,我知道我可以采取其他方法,例如对协变量G和观测值t进行样条回归,并在F进行预测,但是这些张量中的点数以及密度的复杂度都将变化,因此,我不需要手动调整个别情况。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。