在Python中计算确定系数
问题描述:
我试图计算Python中的coefficient of determination(R^2),但在某些情况下我得到一个负值。这是否表示计算中有错误?我以为R^2应该是有界的0和1之间在Python中计算确定系数
下面是做计算我的Python代码,从WP文章直改编:
>>> yi_list = [1, 1, 63, 63, 5, 5, 124, 124]
>>> fi_list = [1.7438055421354988, 2.3153069186947639, 1002.7093097555808, 63.097699219524706, 6.2635465467410842, 7.2275532522971364, 17.55393551900103, 40.8570]
>>> y_mean = sum(yi_list)/float(len(yi_list))
>>> ss_tot = sum((yi-y_mean)**2 for yi in yi_list)
>>> ss_err = sum((yi-fi)**2 for yi,fi in zip(yi_list,fi_list))
>>> r2 = 1 - (ss_err/ss_tot)
>>> r2
-43.802085810924964
答
您的维基百科文章中显示的计算实现对我来说确实很好。
根据维基百科文章:R2的范围外
值0到1,就可能出现在那里它被用来测量观察到的和模型化的值,并且其中没有获得“建模”值之间的协议通过线性回归和取决于使用哪种配方的R2。
看看你的数据,期望模型63和1002.7093097555808可能是大方差的主要来源。
答
望着文章,我觉得这是预期给定输入数据的行为。在介绍中,它说:
重要的情况下,其中R 2的定义计算可以产生负值,这取决于所使用的定义,其中出现正被比较的相应结果的预测尚未从一个模型 - 衍生使用这些数据的拟合程序。
我看不到公式中的任何内容,这意味着它总是在0-1范围内。
答
不,公式中没有错误。 你的价值并不相关(看y3和f3:63和1002)。
只是为了说明R2不受0,1的限制,想象其中一个f几乎是无限的。 Serr也将接近无限,所以R2接近无限。
X和Y值之间没有混淆吗?
(抱歉“接近无穷大”一点,但我不知道如何更好地用英语说了吧)
答
这里是计算在python判定系数的函数:
import numpy as np
def rSquare(estimations, measureds):
""" Compute the coefficient of determination of random data.
This metric gives the level of confidence about the model used to model data"""
SEE = ((np.array(measureds) - np.array(estimations))**2).sum()
mMean = (np.array(measureds)).sum()/float(len(measureds))
dErr = ((mMean - measureds)).sum()
return 1 - (SEE/dErr)
对,我刚注意到这个警告。我的数据是用多项式表达式生成的,所以我想这是有道理的。 – Cerin 2010-08-11 16:39:46