皮尔森 python_张量流和Scipy的Pearson相关为何不同

在您给出的最小可验证示例中,y_pred和{}是整数列表。在scipy.stats.measures.pearsonrsource的第一行中,您将看到输入被转换成带有x = np.asarray(x)的numpy数组。我们可以通过以下方式查看这些数组的结果数据类型:print(np.asarray(y_pred).dtype) # Prints 'int64'

在对两个int64数进行除法时,SciPy使用float64精度,而TensorFlow在上面的例子中将使用float32精度。即使是一个部门,差别也可能很大:

^{pr2}$

通过对y_pred和y_true使用float32精度,可以得到SciPy和TensorFlow的相同结果:import numpy as np

import tensorflow as tf

import scipy.stats as measures

y_pred = np.array([2, 2, 3, 4, 5, 5, 4, 2], dtype=np.float32)

y_true = np.array([1, 2, 3, 4, 5, 6, 7, 8], dtype=np.float32)

## Scipy

val2 = measures.pearsonr(y_pred, y_true)[0]

print("Scipy's Pearson: \t\t{}".format(val2))

## Tensorflow

logits = tf.placeholder(tf.float32, [8])

labels = tf.to_float(tf.Variable(y_true))

acc, acc_op = tf.contrib.metrics.streaming_pearson_correlation(logits,labels)

sess = tf.Session()

sess.run(tf.local_variables_initializer())

sess.run(tf.global_variables_initializer())

sess.run(acc, {logits:y_pred})

sess.run(acc_op, {logits:y_pred})

print("Tensorflow's Pearson: \t{}".format(sess.run(acc,{logits:y_pred})))

印刷品Scipy's Pearson: 0.38060760498046875

Tensorflow's Pearson: 0.38060760498046875

SciPy和TensorFlow计算的差异

在你报告的考试成绩中,差别相当大。我看了一眼source,发现了以下区别:

1。更新ops

tf.contrib.metrics.streaming_pearson_correlation的结果不是无状态的。它返回相关系数op,以及新传入数据的update_op。如果在使用实际的y_pred调用系数op之前使用不同的数据调用update op,则会得到完全不同的结果:sess.run(tf.global_variables_initializer())

for _ in range(20):

sess.run(acc_op, {logits: np.random.randn(*y_pred.shape)})

print("Tensorflow's Pearson: \t{}".format(sess.run(acc,{logits:y_pred})))

印刷品Scipy's Pearson: 0.38060760498046875

Tensorflow's Pearson: -0.0678008571267128

2。不同的公式

西皮:

张量流:

在数学上相同的情况下,张量流中相关系数的计算是不同的。它利用(x,x),(x,y)和(y,y)的样本协方差来计算相关系数,这会引入不同的舍入误差。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值