2017-08-25 55 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]