在张量流中实现顺序蒙特卡洛重采样例程

时间:2018-11-07 16:35:07

标签: python tensorflow resampling

我正在尝试在tensorflow中实现一个自定义损失函数(基于顺序蒙特卡洛aka粒子滤波器),该函数包括一个重新采样例程,但是我似乎无法弄清楚如何正确实现索引,因此它可以在tf.Session()

中运行

等效的python函数是

import numpy as np
N = [1000, 1]
ind = np.arange(N[0])
import tensorflow as tf
import tensorflow_probability as tfp
U = tfp.distributions.Uniform(0.0, 1.0)

...

def resampling(w, x):
    bins = tf.cumsum(w/tf.reduce_sum(w))
    u = (ind + U.sample(N))/N[0]
    indx = np.digitize(u, bins) # <- this is my problem
    return x[indx]

其中w是一组归一化的权重,而x是状态向量。 wx都是张量。

问题的症结在于,我似乎找不到任何可以使我在张量的一维上进行迭代(在这种情况下为shape = [1000, 1])并且基于某些条件的操作也就是说,bin的索引是什么,因此X(因为w是权重X的向量)的权重是,给定均匀分布中的某些样本为<= cdf := bins中的一些值。

编辑进一步的说明

我可以使用什么tensorflow ops来代替np.digitize?,它基本上遍历bins(cdf)中定义的数组,并寻找满足bins[i-1] <= x < bins[i]的值,其中i是值。

解决该问题的另一种方法是通过取U = tfp.distributions.Uniform(0.0, 1.0)来对U.sample([1000, 1])进行采样,然后遍历这些值以找到最接近cdf中该值的索引i(箱)即U[0, 0] >= min(bin[i])用于U中所有样本。这样,我就从最可能的值中进行采样(因为w是一种概率度量),n = 1000次,因此需要重新采样。如何在损失函数内迭代张量?

我希望我对自己的解释足够清楚,但是如果您需要进一步澄清,请与我联系,我真的很想知道如何做到这一点。

0 个答案:

没有答案