无法复现torcheval.metrics.r2_score总平方和计算,求差异解释
手动计算R²与torcheval.metrics.R2Score结果不一致的原因
核心结论:两种TSS计算方式在数学上是等价的,数值不匹配源于张量维度处理或对torcheval公式的误解。
数学等价性验证
手动计算的TSS公式:
ss_total = torch.sum((var1 - torch.mean(var1)) ** 2)
torcheval的TSS计算公式:
tss = sum_squared_obs - torch.square(sum_obs) / num_obs
其中sum_squared_obs = torch.sum(var1 ** 2),sum_obs = torch.sum(var1),num_obs = len(var1)。
通过代数推导可证明两者完全等价:
sum((x - μ)²) = sum(x²) - 2μsum(x) + Nμ² = sum(x²) - 2*(sumx/N)*sumx + N*(sumx/N)² = sum(x²) - (sumx²)/N = sum_squared_obs - (sum_obs)²/num_obs
你的数值差异分析
从你提供的输出看:
- 手动计算的
ss_total=3.7081,但按torcheval的sum_squared_obs=22.2245、sum_obs=-29.9617、num_obs=64计算,TSS应为:22.2245 - (897.7044)/64 ≈ 8.1979 - 两者的
ss_residual一致(均为8.9471),说明var1和var2的取值是相同的,差异出在TSS的计算维度上。
可能的原因
多维张量的维度处理差异
如果var1是多维张量(比如形状为(64, k),k为特征数):- torcheval的
R2Score默认(multioutput='uniform_average')会对每个特征单独计算TSS和R²,再取平均值; - 你的手动计算是对所有元素计算全局均值和TSS,导致结果完全不同。
解决:手动计算时按特征维度拆分计算,或设置R2Score(multioutput='raw_values')查看每个特征的R²结果。
- torcheval的
对torcheval公式的误解
你贴出的官方文档中sum_squared_obs = torch.sum((actual - torch.mean(actual)) ** 2)是错误的,实际torcheval中sum_squared_obs是torch.sum(actual ** 2)。如果按照错误的文档实现torcheval的公式,会导致TSS计算错误。
验证方法
检查var1的形状:
print(var1.shape)
如果是多维,尝试手动按特征维度计算R²再平均:
ss_total_per_feature = torch.sum((var1 - torch.mean(var1, dim=0)) ** 2, dim=0) ss_residual_per_feature = torch.sum((var1 - var2) ** 2, dim=0) r2_per_feature = 1 - (ss_residual_per_feature / ss_total_per_feature) r2_manual_average = torch.mean(r2_per_feature)
这个结果应该和torcheval的输出一致。
内容的提问来源于stack exchange,提问作者Sergio Solorzano
相关产品推荐
相关产品推荐

