2014-10-31 55 views
1

我在蟒蛇新,我的問題是,我有一個給定的一組數據:尋找最高的R^2值

import numpy as np 

x=np.arange(1,5) 
y=np.arange(5,9) 

我的問題是要找到一個數n(不一定是整數)當我繪製y^n與x時,這將給我R^2值的最高值。我正在考慮生成n例如:

n=np.linspace(1,9,100) 

我不知道如何執行我的想法。我的另一種方法是使用生成n的蠻力,併爲每個n的值增加y。在得到這個值之後(我們假設y1),我將繪製y1與x(這意味着我必須生成100個繪圖,但我不知道如何獲得給定繪圖的R^2值(對於線性擬合) 。

我想要做的是有R^2個值的列表(或陣列):

R2= np.array() #a set containing the R^2 values calculated from the plots 

,發現陣列上,並從那裏的最大值,發現了該地塊因此我會找到一個特定的n,我不知道該怎麼做

+0

只是爲了澄清,R^2代表什麼? – FortMauris 2014-10-31 01:27:21

+0

@FortMauris R^2給出兩個量之間的相關性。如果我繪製y vs x並獲得R^2值爲1(最大值),則表示它們彼此相關。 R^2越接近1,最好的 – justin 2014-10-31 01:37:32

+0

R2也被稱爲[確定係數](https://en.wikipedia.org/wiki/Coefficient_of_determination) – 2014-10-31 02:35:48

回答

0

如果你能夠使用熊貓庫,這個問題很容易表達:

import pandas 
import numpy as np 

x = pandas.Series(np.arange(1,5)) 
y = pandas.Series(np.arange(5,9)) 
exponents = exponents = np.linspace(1, 9, 100) 

r2s = {n:pandas.ols(x=x, y=y**n).r2 for n in exponents} 
max(r2s.iteritems(), key=lambda x: x[1]) 
#>>> (1.0, 1.0) 

斷裂下來:

  1. pandas.Series對象是數據的索引列。它就像一個numpy陣列,但具有額外的功能。在這種情況下,我們只關心它,因爲這是我們可以傳遞給pandas.ols的東西。
  2. pandas.ols是最小二乘迴歸的基本實現。你可以直接用numpy.linalg.lstsq在numpy中做到這一點,但它不會直接爲你報告R平方值。要用純numpy做到這一點,您需要從numpy的lstsq中獲得平方殘差的總和,然後手動執行R平方的公式計算。你可以把它寫成一個函數(可能是一個很好的練習)。
  3. {..}內的東西是dict的理解。它將迭代所需的指數,對每個函數執行ols函數,並報告使用任何指數來獲取它的索引的.r2屬性(其中R平方統計量被存儲)。
  4. 最後一步是在r2s的鍵值對序列上調用max,並且key告訴max它是元素進行比較的第二個元素(R平方)。

一個例子功能只np.linalg.lstsq做到這一點是在這裏(good explanation for calculating R2 in numpy):

def r2(x, y): 
    x_with_intercept = np.vstack([x, np.ones(len(x))]).T 
    coeffs, resid = np.linalg.lstsq(x_with_intercept, y)[:2] 
    return 1 - resid/(y.size * y.var())[0] 

然後在純numpy的上述辦法:

import numpy as np 

x = np.arange(1,5) 
y = np.arange(5,9) 
exponents = np.linspace(1, 9, 100) 

r2s = {n:r2(x=x, y=y**n) for n in exponents} 
max(r2s.iteritems(), key=lambda x: x[1]) 
#>>> (1.0, 1.0) 

最後一點,有一個更奇特的方式來指定從某物中獲取1位置物品。您可以使用內置庫operator和調用itemgetter

max(..., key=operator.itemgetter(1)) 

表達itemgetter(1)導致一個對象,它是可調用 - 當它被稱爲交易者的意見r它調用__getitem__協議導致r[1]

+0

嗨,對不起,我認爲我犯了一個錯誤我的問題。我想要做的就是猜測n,以便我得到1的R^2值(這是最高值)。我嘗試在excel中創建樣本數據,並獲得線性趨勢的以下結果: x =(1,2,3,4) y =(1,2,3,4) R^2 = 1 和 x =(1,2,3,4) y =(1,4,9,16) R^2 = 0.969 ...這是您的代碼給出的內容。它給出了n = 1的R^2值。例如對於第二組數據,如果n = 2,則它將具有R^2 = 1的值。對不起,我的問題錯了。 – justin 2014-11-02 11:45:08