1、背景知识1.1 插值、拟合、回归和预测插值、拟合、回归和预测,都是数学建模中经常提到的概念,而且经常会被混为一谈。
因此,插值和拟合都是根据已知数据点求变化规律和特征相似的近似曲线的过程,但是插值要求近似曲线完全经过给定的数据点,而拟合只要求近似曲线在整体上尽可能接近数据点,并反映数据的变化规律和发展趋势。插值可以看作是一种特殊的拟合,是要求误差函数为 0的拟合。由于数据点通常都带有误差,误差为 0 往往意味着过拟合,过拟合模型对于训练集以外的数据的泛化能力是较差的。因此在实践中,插值多用于图像处理,拟合多用于实验数据处理。
回归是一种数据分析方法,拟合是一种具体的数据处理方法。拟合侧重于曲线参数寻优,使曲线与数据相符;而回归侧重于研究两个或多个变量之间的关系。 欢迎关注 Youcans 原创系列,每周更新数模笔记 Python数模笔记-PuLP库 1.2 线性回归回归分析(Regression analysis)是一种统计分析方法,研究是自变量和因变量之间的定量关系,经常用于预测分析、时间序列模型以及发现变量之间的因果关系。按照变量之间的关系类型,回归分析可以分为线性回归和非线性回归。 线性回归(Linear regression) 假设给定数据集中的目标(y)与特征(X)存在线性关系,即满足一个多元一次方程 。 回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,称为一元线性回归;如果包括两个或多个的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归。 进一步地,还需要分析对于样本数据究竟能不能采用线性回归方法,或者说线性相关的假设是否合理、线性模型是否具有良好的稳定性?这就需要使用统计分析进行显著性检验,检验因变量与自变量之间的线性关系是否显著,用线性模型来描述它们之间的关系是否恰当。 2、Statsmodels 进行线性回归本节结合 Statsmodels 统计分析包 的使用介绍线性拟合和回归分析。线性模型可以表达为如下公式: 2.1 导入工具包
2.2 导入样本数据样本数据通常保存在数据文件中,因此要读取数据文件获得样本数据。为便于阅读和测试程序,本文使用随机数生成样本数据。读取数据文件导入数据的方法,将在后文介绍。
本案例是一元线性回归问题,(yTest,x)是导入的样本数据,我们需要通过线性回归获得因变量 y 与自变量 x 之间的定量关系。yTrue 是理想模型的数值,yTest 模拟实验检测的数据,在理想模型上加入了正态分布的随机误差。 2.3 建模与拟合 一元线性回归模型方程为:
statsmodels.OLS 是 statsmodels.regression.linear_model 的函数,有 4个参数 (endog, exog, missing, hasconst)。 第一个参数 endog 是回归模型中的因变量 y(t), 是1-d array 数据类型。 第二个输入 exog 是自变量 x0(t),x1(t),…,xm(t),是(m+1)-d array 数据类型。 2.4 拟合和统计结果的输出Statsmodels 进行线性回归分析的输出结果非常丰富,results.summary() 返回了回归分析的摘要。
摘要所返回的内容非常丰富,这里先讨论最重要的一些结果,在 summary 的中间段落。 ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------const 2.4669 0.186 13.230 0.000 2.097 2.837x1 1.5883 0.032 49.304 0.000 1.524 1.652 ==============================================================================
Statsmodels 也可以通过属性获取所需的回归分析的数据,例如:
3、一元线性回归3.1 一元线性回归 Python 程序:# LinearRegression_v1.py# Linear Regression with statsmodels (OLS: Ordinary Least Squares)# v1.0: 调用 statsmodels 实现一元线性回归# 日期:2021-05-04import numpy as npimport matplotlib.pyplot as pltimport statsmodels.api as smfrom statsmodels.sandbox.regression.predstd import wls_prediction_std# 主程序# === 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===def main(): # 主程序# 生成测试数据:nSample = 100x1 = np.linspace(0, 10, nSample) # 起点为 0,终点为 10,均分为 nSample个点e = np.random.normal(size=len(x1)) # 正态分布随机数yTrue = 2.36 + 1.58 * x1 # y = b0 + b1*x1yTest = yTrue + e # 产生模型数据# 一元线性回归:最小二乘法(OLS)X = sm.add_constant(x1) # 向矩阵 X 添加截距列(x0=[1,...1])model = sm.OLS(yTest, X) # 建立最小二乘模型(OLS)results = model.fit() # 返回模型拟合结果yFit = results.fittedvalues # 模型拟合的 y值prstd, ivLow, ivUp = wls_prediction_std(results) # 返回标准偏差和置信区间# OLS model: Y = b0 + b1*X + eprint(results.summary()) # 输出回归分析的摘要print("\nOLS model: Y = b0 + b1 * x") # b0: 回归直线的截距,b1: 回归直线的斜率print('Parameters: ', results.params) # 输出:拟合模型的系数# 绘图:原始数据点,拟合曲线,置信区间fig, ax = plt.subplots(figsize=(10, 8)) ax.plot(x1, yTest, 'o', label="data") # 原始数据ax.plot(x1, yFit, 'r-', label="OLS") # 拟合数据ax.plot(x1, ivUp, '--',color='orange',label="upConf") # 95% 置信区间 上限ax.plot(x1, ivLow, '--',color='orange',label="lowConf") # 95% 置信区间 下限ax.legend(loc='best') # 显示图例plt.title('OLS linear regression ') plt.show()returnif __name__ == '__main__': #YouCans, XUPTmain() 3.2 一元线性回归 程序运行结果:OLS Regression Results ==============================================================================Dep. Variable: y R-squared: 0.961Model: OLS Adj. R-squared: 0.961Method: Least Squares F-statistic: 2431.Date: Wed, 05 May 2021 Prob (F-statistic): 5.50e-71Time: 16:24:22 Log-Likelihood: -134.62No. Observations: 100 AIC: 273.2Df Residuals: 98 BIC: 278.5Df Model: 1 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975]------------------------------------------------------------------------------const 2.4669 0.186 13.230 0.000 2.097 2.837x1 1.5883 0.032 49.304 0.000 1.524 1.652==============================================================================Omnibus: 0.070 Durbin-Watson: 2.016Prob(Omnibus): 0.966 Jarque-Bera (JB): 0.187Skew: 0.056 Prob(JB): 0.911Kurtosis: 2.820 Cond. No. 11.7==============================================================================OLS model: Y = b0 + b1 * xParameters: [2.46688389 1.58832741] 4、多元线性回归4.1 多元线性回归 Python 程序:# LinearRegression_v2.py# Linear Regression with statsmodels (OLS: Ordinary Least Squares)# v2.0: 调用 statsmodels 实现多元线性回归# 日期:2021-05-04import numpy as npimport matplotlib.pyplot as pltimport statsmodels.api as smfrom statsmodels.sandbox.regression.predstd import wls_prediction_std# 主程序# === 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===def main(): # 主程序# 生成测试数据:nSample = 100x0 = np.ones(nSample) # 截距列 x0=[1,...1]x1 = np.linspace(0, 20, nSample) # 起点为 0,终点为 10,均分为 nSample个点x2 = np.sin(x1) x3 = (x1-5)**2X = np.column_stack((x0, x1, x2, x3)) # (nSample,4): [x0,x1,x2,...,xm]beta = [5., 0.5, 0.5, -0.02] # beta = [b1,b2,...,bm]yTrue = np.dot(X, beta) # 向量点积 y = b1*x1 + ...+ bm*xmyTest = yTrue + 0.5 * np.random.normal(size=nSample) # 产生模型数据# 多元线性回归:最小二乘法(OLS)model = sm.OLS(yTest, X) # 建立 OLS 模型: Y = b0 + b1*X + ... + bm*Xm + eresults = model.fit() # 返回模型拟合结果yFit = results.fittedvalues # 模型拟合的 y值print(results.summary()) # 输出回归分析的摘要print("\nOLS model: Y = b0 + b1*X + ... + bm*Xm")print('Parameters: ', results.params) # 输出:拟合模型的系数 # 绘图:原始数据点,拟合曲线,置信区间prstd, ivLow, ivUp = wls_prediction_std(results) # 返回标准偏差和置信区间fig, ax = plt.subplots(figsize=(10, 8)) ax.plot(x1, yTest, 'o', label="data") # 实验数据(原始数据+误差)ax.plot(x1, yTrue, 'b-', label="True") # 原始数据ax.plot(x1, yFit, 'r-', label="OLS") # 拟合数据ax.plot(x1, ivUp, '--',color='orange', label="ConfInt") # 置信区间 上届ax.plot(x1, ivLow, '--',color='orange') # 置信区间 下届ax.legend(loc='best') # 显示图例plt.xlabel('x') plt.ylabel('y') plt.show()returnif __name__ == '__main__': main() 4.2 多元线性回归 程序运行结果:OLS Regression Results ==============================================================================Dep. Variable: y R-squared: 0.932 Model: OLS Adj. R-squared: 0.930 Method: Least Squares F-statistic: 440.0 Date: Thu, 06 May 2021 Prob (F-statistic): 6.04e-56 Time: 10:38:51 Log-Likelihood: -68.709 No. Observations: 100 AIC: 145.4 Df Residuals: 96 BIC: 155.8 Df Model: 3 Covariance Type: nonrobust ============================================================================== coef std err t P>|t| [0.025 0.975] ------------------------------------------------------------------------------const 5.0411 0.120 41.866 0.000 4.802 5.280 x1 0.4894 0.019 26.351 0.000 0.452 0.526 x2 0.5158 0.072 7.187 0.000 0.373 0.658x3 -0.0195 0.002 -11.957 0.000 -0.023 -0.016 ==============================================================================Omnibus: 1.472 Durbin-Watson: 1.824 Prob(Omnibus): 0.479 Jarque-Bera (JB): 1.194 Skew: 0.011 Prob(JB): 0.551Kurtosis: 2.465 Cond. No. 223. ==============================================================================OLS model: Y = b0 + b1*X + ... + bm*Xm Parameters: [ 5.04111867 0.4893574 0.51579806 -0.01951219] 5、附录:回归结果详细说明Dep.Variable: y 因变量Model:OLS 最小二乘模型Method: Least Squares 最小二乘No. Observations: 样本数据的数量Df Residuals:残差自由度(degree of freedom of residuals)Df Model:模型自由度(degree of freedom of model)Covariance Type:nonrobust 协方差阵的稳健性R-squared:R 判定系数Adj. R-squared: 修正的判定系数F-statistic: 统计检验 F 统计量Prob (F-statistic): F检验的 P值Log likelihood: 对数似然coef:自变量和常数项的系数,b1,b2,...bm,b0std err:系数估计的标准误差t:统计检验 t 统计量P>|t|:t 检验的 P值[0.025, 0.975]:估计参数的 95%置信区间的下限和上限Omnibus:基于峰度和偏度进行数据正态性的检验Prob(Omnibus):基于峰度和偏度进行数据正态性的检验概率Durbin-Watson:检验残差中是否存在自相关Skewness:偏度,反映数据分布的非对称程度Kurtosis:峰度,反映数据分布陡峭或平滑程度Jarque-Bera(JB):基于峰度和偏度对数据正态性的检验Prob(JB):Jarque-Bera(JB)检验的 P值。Cond. No.:检验变量之间是否存在精确相关关系或高度相关关系。 版权说明: |
|
来自: LibraryPKU > 《科学计算》