2010-08-11 179 views
2

我试图计算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 

回答

3

您的维基百科文章中显示的计算实现对我来说确实很好。

根据维基百科文章:R2的范围外

值0到1,就可能出现在那里它被用来测量观察到的和模型化的值,并且其中没有获得“建模”值之间的协议通过线性回归和取决于使用哪种配方的R2。

看看你的数据,期望模型63和1002.7093097555808可能是大方差的主要来源。

+0

对,我刚注意到这个警告。我的数据是用多项式表达式生成的,所以我想这是有道理的。 – Cerin 2010-08-11 16:39:46

1

望着文章,我觉得这是预期给定输入数据的行为。在介绍中,它说:

重要的情况下,其中R 2的定义计算可以产生负值,这取决于所使用的定义,其中出现正被比较的相应结果的预测尚未从一个模型 - 衍生使用这些数据的拟合程序。

我看不到公式中的任何内容,这意味着它总是在0-1范围内。

1

不,公式中没有错误。 你的价值并不相关(看y3和f3:63和1002)。

只是为了说明R2不受0,1的限制,想象其中一个f几乎是无限的。 Serr也将接近无限,所以R2接近无限。

X和Y值之间没有混淆吗?

(抱歉“接近无穷大”一点,但我不知道如何更好地用英语说了吧)

0

这里是计算在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)