2017-08-25 54 views

回答

1

你可以用两个随机变量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她e,因为你通常不知道概率分布。在许多情况下,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) 
0

函数contrib.metrics.streaming_covariance创建一个update_op操作,该操作更新基础变量并返回更新的协方差。所以你的代码应该是:

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

z, op = tf.contrib.metrics.streaming_covariance(x,y) 

with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    tf.local_variables_initializer().run() 

    sess.run([op]) 
    print(sess.run([z])) 

#Output 
[-17.142859]