如果你能夠使用熊貓庫,這個問題很容易表達:
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)
斷裂下來:
- 的
pandas.Series
對象是數據的索引列。它就像一個numpy
陣列,但具有額外的功能。在這種情況下,我們只關心它,因爲這是我們可以傳遞給pandas.ols
的東西。
pandas.ols
是最小二乘迴歸的基本實現。你可以直接用numpy.linalg.lstsq
在numpy中做到這一點,但它不會直接爲你報告R平方值。要用純numpy做到這一點,您需要從numpy的lstsq
中獲得平方殘差的總和,然後手動執行R平方的公式計算。你可以把它寫成一個函數(可能是一個很好的練習)。
{..}
內的東西是dict
的理解。它將迭代所需的指數,對每個函數執行ols
函數,並報告使用任何指數來獲取它的索引的.r2
屬性(其中R平方統計量被存儲)。
- 最後一步是在
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]
。
來源
2014-10-31 02:27:57
ely
只是爲了澄清,R^2代表什麼? – FortMauris 2014-10-31 01:27:21
@FortMauris R^2給出兩個量之間的相關性。如果我繪製y vs x並獲得R^2值爲1(最大值),則表示它們彼此相關。 R^2越接近1,最好的 – justin 2014-10-31 01:37:32
R2也被稱爲[確定係數](https://en.wikipedia.org/wiki/Coefficient_of_determination) – 2014-10-31 02:35:48