找到最高的R ^ 2值

时间:2014-10-31 01:25:18

标签: python numpy

我是python中的新手,我的问题是我有一组给定的数据:

import numpy as np

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

我的问题是找到一个数字n(不一定是一个整数),当我绘制y ^ n vs 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

并找到该数组的最大值,并从那里找到给出该R ^ 2值的图,这样我就会找到一个特定的n。我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

如果你能够使用pandas库,这个问题很容易表达:

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平方统计量的地方),并使用任何指数编号来索引它。 / LI>
  4. 最后一步是在max中的一系列键值对上调用r2skey告诉max它是第二个元素(R平方)通过哪些元素进行比较。
  5. 仅使用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]。< / p>