上一篇文章讲了最小二乘算法的原理。 本文通过一个简单的例子来看看如何通过最小乘法实现线性回归模型的参数估计。
王松贵老师《线性统计模型——线性回归与方差分析》一书中的例3.1.3。
据说,一个实验容器依靠蒸汽提供热量来保持恒温。 经过一段时间的观察,得到如下图的一组数据:
蒸汽环境温度数据
其中,自变量
那么,我们如何对这组数据进行线性回归分析呢? 一般分为三个步骤:(1)画散点图,找模型; (2)估计回归模型的参数; (3)检验前面分析得到的经验模型是否合适。
绘制散点图
创建一个文件夹,在其中创建“data”和“demo”文件夹,用于存放数据文件和程序文件。
将上图中的数据导入Excel,命名为:“Steam .xlsx”作为数据源。
数据导入Excel后
创建文件:“.py”。 在文件头添加UTF-8编码指令以支持汉字,然后添加必要的注释。
# -*- coding: utf-8 -*-
"""
Created on Fri Mar 20 14:07:41 2020
@author: gao
"""
必要的第三方库。
"""
第三方库
"""
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
import numpy as np
使用下面的代码将 Excel 数据读入其中。
"""
把excel中的数据读入datafram
"""
filePath = u'../data/蒸汽供应.xlsx' #含中文字符,前面加u表示用Unicode 格式进行编码
data = pd.read_excel(filePath, index_col=u'序号')
提取Y和X列并绘制散点图
Xi = data[u'X']
Yi = data[u'Y']
"""
画散点图
"""
plt.figure()
plt.scatter(Xi, Yi, color='red', label='sample data',linewidth=2)
plt.legend(loc='lower right')
plt.show()
散点图结果如下:
散点图
从图中可以看出,它一般服从线性分布,因此我们采用线性回归模型进行分析。
回归模型的参数估计
一变量线性模型的一般公式为
单变量线性回归模型
我们使用最小二乘法估计α和β以获得经验回归方程。
经验模型
一变量线性模型参数的参数估计非常简单,如以下代码所示:
def fun(p,x): #回归模型函数
k,b = p
return k*x+b
def error(p,x,y): #误差
return fun(p,x)-y
p0 = np.array([1,3])
para = leastsq(error,p0,args=(Xi,Yi))
k,b = para[0]
上面的代码中有三个关键点:
(1)定义模型函数和误差函数。 误差函数误差实际上是我们模型的估计值与实际观测值之间的差异。 我们通过该差异的最小二乘来估计模型中的参数。 也就是说,如果前面的经验模型的参数取不同的值,那么xi就可以得到不同的yi。 这个yi就是我们的估计值和实际观测值的差值,也就是估计误差。 不同的参数值有不同的估计误差。 ,我们需要找到一组参数来最小化所有观测值的误差平方和。
(2)调用scipy的函数时,需要误差函数和初始参数作为输入,还需要将我们读入的观测数据作为参数传递到函数中。 这是该函数的三个关键输入参数。
(3)有多个返回参数,因此将它们放入一个元组中,返回的元组类型para的第一个元素para[0]是一个nupy。 type,存储满足最小二乘规则的参数。 估计参数。
经验模型的效果
您可以使用以下代码来打印最小二乘运算后的经验模型。
"""
打印结果
"""
print('y='+str(round(k,2)) + 'x+' +str(round(b,2)))
最后一步是在前面的散点图上画出我们的经验模型的线,以查看模型的效果。
"""
绘制结果曲线
"""
x=np.linspace(20,80,2)
y=k*x+b
"""
画散点图
"""
plt.figure()
plt.scatter(Xi, Yi, color='red', label='sample data',linewidth=2)
plt.plot(x,y,color='blue',label='result line')
plt.legend(loc='lower right')
plt.show()
生成的图像绘制如下:
模型结果曲线
当然,我们也可以使用决定系数来看看我们的回归方程对数据的拟合程度。 这将在后续文章中讨论。