如何在Tensorflow中进行核密度估计

3

我正在尝试在Tensorflow中编写一个核密度估计算法。

在拟合KDE模型时,我正在遍历当前批次中的所有数据,并为每个数据创建一个内核,使用tensorflow.contrib.distributions.MultivariateNormalDiag对象:

self.kernels = [MultivariateNormalDiag(loc=data, scale=bandwidth) for data in X]

稍后,在尝试预测相对于上面适配的模型的数据点的可能性时,对于每个要评估的数据点,我将上述每个内核给出的概率相加:

tf.reduce_sum([kernel._prob(X) for kernel in self.kernels], axis=0)

X是numpy数组时,这种方法才能起作用,因为TF不允许您迭代Tensor。我的问题是,是否有一种方法可以使上述算法在X作为tf.Tensortf.Variable时起作用?

1个回答

0

我找到的一个解决这个问题的答案,是一举解决拟合KDE和预测概率的问题。但实现方法有些折中。

def fit_predict(self, data):
    return tf.map_fn(lambda x: \ 
        tf.div(tf.reduce_sum(
            tf.map_fn(lambda x_i: self.kernel_dist(x_i, self.bandwidth).prob(x), self.fit_X)),
            tf.multiply(tf.cast(data.shape[0], dtype=tf.float64), self.bandwidth[0])), self.X)

第一个tf.map_fn迭代遍历我们计算可能性的数据,将每个单独内核的概率相加。

第二个tf.map_fn迭代遍历我们用于拟合模型的所有数据,并创建一个tf.contrib.distributions.Distribution(这里由kernel_dist参数化)。

self.Xself.fit_X是在初始化KernelDensity对象时创建的占位符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接