手动计算
def linegress(l_1,l_2): #求两列数据的线性回归参数
import numpy as np
from numpy.linalg import solve
sumx = np.sum(l_1) #x列的和
sumy = np.sum(l_2) #y列的和
n = len(l_1) #数据的个数
sumxy = np.sum(np.array(l_1)*np.array(l_2)) #xy两列的乘积的和
sumx2 = np.sum(np.array(l_1)**2) #x的平方的和
a = np.mat([[sumx,n],[sumx2,sumx]]) #用np.mat传入第一个矩阵
b = np.mat([sumy,sumxy]).T #用np.mat.T传入第二个矩阵
x = solve(a,b) #求出ab
return x #输出
这里得到以下输出结果
matrix([[ 0.88632061], [-89.12267277]])
上面的就是我们手动笔算线性回归参数的时候会得到的结果,a=0.886,b=-89.123
我们把我们得到的ab代入Y=ax+b来计算新的y列,并求出r2
"""計算"""
import numpy as np
x = np.array([171,180,169,173,173,163,168,176,173,174,164,171,172,172,175,163,163,162,167,170,173,170,170,175,170]) #x列
y = np.array([62,71,53,78,59,54,62,60,62,60,50,66,69,63,62,65,53,52,60,67,70,67,56,68,56]) #y列
a = 0.886
b = -89.123
y_pred = 0.886*x-89.123
s2=((y-y.mean())**2).sum(axis=0)/len(x)
delta=((y-y_pred)**2).sum(axis=0)/len(x)
r2 = (s2-delta)/s2
print('r2=',r2)
我们会得到以下输出结果。
r2= 0.35430340124555104
所以,我们再手动去计算x,y的线性回归的时候,会得到以下的结果:
a=0.886,b=-89.123,r2= 0.354
statsmodels.ols的计算结果
import statsmodels.api as sm
X = sm.add_constant(x)
results = sm.OLS(y,X).fit()
print(results.params)
我们会得到以下结果:
[-89.12267277 0.88632061]
和我们手动计算得到的结果是完全一样的。
打印拟合的详细结果
print(results.summary())
右上角有一个r2,0.354,和我们计算的结果依然是一样的。
然后打印结果中间有一个coef,这个就是我们得到的a和b。不一样的地方是,const的coef就是我们所说的截距,而x1的coef就是我们所说的系数。如果你做的是重回归,那么除了x1之外还会有x234,他们的coef同样是系数,而const依然是截距。
版权声明:本文为Kurumi0729原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。