2010-08-11 64 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)