2014-10-31 73 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