如果你能够使用熊猫库,这个问题很容易表达:
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