我有一个问题,我不知道如何计算两个张量的协方差。我已经尝试过contrib.metrics.streaming_covariance。但是总是返回0。必须有一些错误。

最佳答案

您可以使用两个随机变量XY与期望值x0y0的协方差的定义:

cov_xx = 1 / (N-1) * Sum_i ((x_i - x0)^2)

cov_yy = 1 / (N-1) * Sum_i ((y_i - y0)^2)

cov_xy = 1 / (N-1) * Sum_i ((x_i - x0) * (y_i - y0))

关键点是在此处估计x0y0,因为您通常不知道概率分布。在许多情况下,估计x_iy_i的平均值分别为x_0y_0,即,估计分布是均匀的。

然后,您可以如下计算协方差矩阵的元素:

import tensorflow as tf

x = tf.constant([1, 4, 2, 5, 6, 24, 15], dtype=tf.float64)
y = tf.constant([8, 5, 4, 6, 2, 1, 1], dtype=tf.float64)

cov_xx = 1 / (tf.shape(x)[0] - 1) * tf.reduce_sum((x - tf.reduce_mean(x))**2)
cov_yy = 1 / (tf.shape(x)[0] - 1) * tf.reduce_sum((y - tf.reduce_mean(y))**2)
cov_xy = 1 / (tf.shape(x)[0] - 1) * tf.reduce_sum((x - tf.reduce_mean(x)) * (y - tf.reduce_mean(y)))

with tf.Session() as sess:
    sess.run([cov_xx, cov_yy, cov_xy])
    print(cov_xx.eval(), cov_yy.eval(), cov_xy.eval())


当然,如果需要矩阵形式的协方差,则可以如下修改最后一部分:

with tf.Session() as sess:
    sess.run([cov_xx, cov_yy, cov_xy])
    print(cov_xx.eval(), cov_yy.eval(), cov_xy.eval())
    cov = tf.constant([[cov_xx.eval(), cov_xy.eval()], [cov_xy.eval(),
        cov_yy.eval()]])
    print(cov.eval())


要验证TensorFlow方式的元素,可以使用numpy进行检查:

import numpy as np

x = np.array([1,4,2,5,6, 24, 15], dtype=float)
y = np.array([8,5,4,6,2,1,1], dtype=float)

pc = np.cov(x,y)
print(pc)

关于python - 如何计算 tensorflow 的协方差?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45874928/

10-13 22:16