数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


利用模块 sklearn. linear_model 中的函数 LinearRegression 求解

利用模块 sklearn. linear_model 中的函数 LinearRegression 可以求解 多元线性回归问题, 但模型检验只有一个指标 $R^{2}$, 需要用户编程实现模型 的其他统计检验。 构建并拟合模型的函数调用格式为 LinearRegression().fit( $(x, y)$ 其中 $x$ 为自变量观测值矩阵 (不包括全部元素为 1 的第一列), $y$ 为因变量 的观察值向量。

案例

问题

水泥凝固时放出的热量 $y$ 与水泥中 2 种主要化学成分 $x_{1}, x_{2}$ 有 关, 今测得一组数据如, 试确定一个线性回归模型 $y=a_{0}+a_{1} x_{1}+a_{2} x_{2}$ 。

序号 x_(1) x_(2) y 序号 x_(1) x_(2) y
1 7 26 78.5 8 1 31 72.5
2 1 29 74.3 9 2 54 93.1
3 11 56 104.3 10 21 47 115.9
4 11 31 87.6 11 1 40 83.8
5 7 52 95.9 12 11 66 113.3
6 11 55 109.2 13 10 68 109.4
7 3 71 102.7

计算

代码

求得的回归模型为: $$ y=52.5773+1.4683 x_{1}+0.6623 x_{2}, $$ 模型的复判定系数(也称为拟合优度) $R^{2}=0.9787$, 拟合效果很好。

利用statsmodels库求解

statsmodels可以使用两种模式求解回归分析模型,一种是基于公式的模式,另一种是基于数组的模式。 基于公式构建并拟合模型的调用格式为:

import statsmodels as sm
sm.formula.ols(formula, data=df)

其中formula为引号括起来的公式,df为数据框或字典格式的数据。

基于数组构建并拟合模型的调用格式为:

import statsmodels.api as sm
sm.OLS(y,X).fit()

其中y为因变量的观察值向量,X为自变量观测值矩阵再添加第一列全部元素为1得到的增广阵。

代码

基于公式

import numpy as np; import statsmodels.api as sm
a=np.loadtxt("data/cement.txt")   
#加载表中x1,x2,y的13行3列数据(数据见封底二维码)
d={'x1':a[:,0],'x2':a[:,1],'y':a[:,2]}
md=sm.formula.ols('y~x1+x2',d).fit()  #构建并拟合模型
print(md.summary(),'\n------------\n')  #显示模型所有信息
ypred=md.predict({'x1':a[:,0],'x2':a[:,1]})  #计算预测值
ypred=md.predict({'x1':a[:,0],'x2':a[:,1]})  #计算预测值

基于数组求解的Python程序如下:

import numpy as np; import statsmodels.api as sm
a=np.loadtxt("data/cement.txt")   
#加载表中x1,x2,y的13行3列数据(数据见封底二维码)
X = sm.add_constant(a[:,:2])  #增加第一列全部元素为1得到增广矩阵
md=sm.OLS(a[:,2],X).fit()  #构建并拟合模型
print(md.params,'\n------------\n')  #提取所有回归系数
y=md.predict(X)      #求已知自变量值的预测值
print(md.summary2())  #输出模型的所有结果