如何基于TensorFlow Tensor实现独立皮尔逊相关系数指标
TensorFlow原生实现皮尔逊相关系数
直接用TensorFlow内置算子实现即可,不需要引入TensorFlow Probability,完全规避依赖冲突和CUDA运行异常问题,实现逻辑严格匹配皮尔逊相关系数的数学定义:
import tensorflow as tf def p_corr(y_true, y_pred): # 统一张量精度,避免类型运算报错 y_true = tf.cast(y_true, tf.float32) y_pred = tf.cast(y_pred, tf.float32) # 计算两个序列的均值 mean_true = tf.reduce_mean(y_true) mean_pred = tf.reduce_mean(y_pred) # 计算协方差项(皮尔逊系数分子) cov = tf.reduce_sum((y_true - mean_true) * (y_pred - mean_pred)) # 计算两个序列的标准差乘积(皮尔逊系数分母),加极小值避免除零错误 std_true = tf.sqrt(tf.reduce_sum(tf.square(y_true - mean_true))) std_pred = tf.sqrt(tf.reduce_sum(tf.square(y_pred - mean_pred))) denominator = std_true * std_pred + 1e-12 return cov / denominator
使用说明
- 入参
y_true和y_pred要求维度完全一致,支持任意形状的数值型张量输入 - 所有算子均为TensorFlow原生支持,可兼容eager执行和静态图模式,直接作为模型训练的评估指标传入
model.compile(metrics=[p_corr])也可正常运行 - 分母加入
1e-12的极小常数做数值稳定性处理,不会影响正常计算的精度,仅在输入序列为常数(标准差为0)时避免出现NaN异常
该实现返回的相关系数取值范围为[-1, 1],值越接近1代表两个序列正相关性越强,越接近-1代表负相关性越强,接近0代表无线性相关性。
内容的提问来源于stack exchange,提问作者Jimut123
相关产品推荐
相关产品推荐

