Реализация последовательной процедуры повторной выборки Монте-Карло в тензорном потоке - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь реализовать пользовательскую функцию потерь (основанную на последовательных фильтрах частиц Монте-Карло) в tensorflow, которая включает процедуру повторной выборки, но я не могу понять, как правильно выполнить индексацию, чтобы она может быть запущен в течение 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 - вектор состояний. И w, и x будут тензорами.

Суть моей проблемы в том, что я не могу найти какие-либо операции, которые позволили бы мне перебрать одно измерение тензора (в данном случае это будет shape = [1000, 1]) и основаны на некоторых критериях, т.е. индекс бинов и, следовательно, X (поскольку w - это вектор весов X) имеет вес, который для некоторой выборки из равномерного распределения равен <= до некоторого значения в cdf := bins.

редактировать дальнейшие разъяснения

Какие операции с тензорным потоком я могу использовать для замены np.digitize?, который в основном перебирает массив, определенный в бинах (в формате cdf), и ищет значение, удовлетворяющее bins[i-1] <= x < bins[i], где i - индекс значения.

Или другой способ решения этой проблемы - это выборка из U = tfp.distributions.Uniform(0.0, 1.0), взяв U.sample([1000, 1]), затем итерируя по этим значениям, чтобы найти индекс i, ближайший к этому значению в cdf (ячейки), то есть U[0, 0] >= min(bin[i]) для всех образцы от U. Таким образом, я выбираю из наиболее вероятных значений (потому что w - это мера вероятности) n = 1000 раз, следовательно, повторная выборка. Как перебрать тензор в функции потерь?

Я надеюсь, что объяснил себя достаточно ясно, но если вам нужны дополнительные разъяснения, пожалуйста, свяжитесь со мной, я бы очень хотел выяснить, как это сделать.

...