我是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。我不知道该怎么做。
答案 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)
打破这个局面:
pandas.Series
对象是索引的数据列。它就像一个numpy
数组,但具有额外的功能。在这种情况下,我们只关心它,因为我们可以传递给pandas.ols
。pandas.ols
是最小二乘回归的基本实现。您可以使用numpy.linalg.lstsq
直接在numpy中执行此操作,但它不会直接为您报告R平方值。要用纯粹的numpy来做,你需要从numpy的lstsq
中得到平方残差的总和,然后手动执行R平方的公式计算。你可以把它写成一个自己的功能(可能是一个很好的练习)。{..}
内的内容是dict
理解。它将迭代所需的指数,为每个指针执行ols
函数,并报告.r2
属性(存储R平方统计量的地方),并使用任何指数编号来索引它。 / LI>
max
中的一系列键值对上调用r2s
,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]
。< / p>