一、线性回归的定义
回归是监督学习的一个重要问题,回归用于预测输入变量和输出变量之间的关系。回归模型是表示输入变量到输出变量之间映射的函数。回归问题的学习等价于函数拟合:使用一条函数曲线使其很好的拟合已知函数且很好的预测未知数据。
回归问题分为模型的学习和预测两个过程。基于给定的训练数据集构建一个模型,根据新的输入数据预测相应的输出。
回归问题按照输入变量的个数可以分为一元回归和多元回归;按照输入变量和输出变量之间关系的类型,可以分为线性回归和非线性回归。
一元回归:y = ax + b
多元回归:
其中,theta是参数,x是我们的训练数据和检测数据中的特征值。实际上,theta是未知量,我们的目标就是通过训练数据调整theta,来使得输出的结果更接近真实值。
二、回归问题求解
2.1最小二乘法
最小二乘法又称最小平方法,它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。
现在假设我们有m个样本,我们假设有:
表示输出值和真实值之间的误差
根据中心极限定理,由于误差项是好多好多相互独立的因素影响的综合影响,我们有理由假设其服从高斯分布,又由于可以自己适配theta0,误差项的高斯分布均值为0,所以我们有
其中,对于正太分布
期望μ = 0,标准差为σ
将
用训练数据替换::
因为我们认为这些数据是独立同分布的,因此所有的训练数据的联合概率就是各自的边缘概率的乘积,得到似然函数::
由极大似然估计的定义,我们需要L(theta)最大,那么我们怎么才能是的这个值最大呢?两边取对数对这个表达式进行化简如下:
所以,我们最后由极大似然估计推导得出,我们希望 J(theta) 最小,而这刚好就是最小二乘法做的工作。而回过头来我们发现,之所以最小二乘法有道理,是因为我们之前假设误差项服从高斯分布,假如我们假设它服从别的分布,那么最后的目标函数的形式也会相应变化。
好了,上边我们得到了有极大似然估计或者最小二乘法,我们的模型求解需要最小化目标函数J(theta),那么我们的theta到底怎么求解呢?有没有一个解析式可以表示theta?
我们需要最小化目标函数,关心 theta 取什么值的时候,目标函数取得最小值,而目标函数连续,那么 theta 一定为 目标函数的驻点,所以我们求导寻找驻点。
求导可得:
最终我们得到参数 theta 的解析式:
上述最后一步有一些问题,假如 X’X不可逆呢?
我们知道 X’X 是一个办正定矩阵,所以若X’X不可逆或为了防止过拟合,我们增加lambda扰动,得到
2.2梯度下降法
我们在上边给出了最小二乘法求解线性回归的参数theta,实际python 的 numpy库就是使用的这种方法。
当然了,这需要我们的参数的维度不大,当维度大的时候,使用解析解就不适用了,这里讨论梯度下降算法。
2.2.2梯度下降法步骤:
初始化theta
沿着负梯度方向迭代,更新后的theta使得J(theta)更小。
其中α表示学习率
就是让theta沿着让J(theta)下降最快的方向移动。求一下梯度方向;
上面的结果是对一个样本求的,实际中的损失函数是
因此可以得到:
加上学习率α
预测车流量
利用最小二乘法预测隧道车流量
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
def calcAB(x,y):
n = len(x)
sumX,sumY,sumXY,sumXX =0,0,0,0
for i in range(0,n):
sumX += x[i]
sumY += y[i]
sumXX += x[i]*x[i]
sumXY += x[i]*y[i]
a = (n*sumXY -sumX*sumY)/(n*sumXX -sumX*sumX)
b = (sumXX*sumY - sumX*sumXY)/(n*sumXX-sumX*sumX)
return a,b,
Traffic_flow = pd.read_csv("Traffic_flow.csv")
xi = Traffic_flow.day
yi = Traffic_flow