你好 ,

话不多说,开始正题,今天主讲线性回归之一元线性回归

首先我们来看一下什么是回归分析:


python 一元线性回归求残差 一元线性回归python代码_python 一元线性回归求残差

python 一元线性回归求残差 一元线性回归python代码_python 回归_02

正相关:



python 一元线性回归求残差 一元线性回归python代码_python 线性回归_03

负相关:



python 一元线性回归求残差 一元线性回归python代码_python求导_04

不相关:



python 一元线性回归求残差 一元线性回归python代码_python求导_05

我们需要求解方程如下,其中θ0和θ1是我们要求解的



python 一元线性回归求残差 一元线性回归python代码_python 回归_06

接下来我们来简单求解一下,如下图我们知道截距和斜率我们都可画出直线



python 一元线性回归求残差 一元线性回归python代码_python 一元线性回归求残差_07

那我们如何才能求解方程系数?在这里我们引入代价函数,而代价函数采用的则是最小二乘法



python 一元线性回归求残差 一元线性回归python代码_python线性回归_08

在这里,i是样本点,m表示m个样本点,公式下面的2可有可无 只是为了后面平方求导时算出来的数好看

我们来看一个例子:



python 一元线性回归求残差 一元线性回归python代码_python 线性回归_09

这里我领你们算一个 后面的算法一样,由左图我们可知斜率是1截距是0(这里是我们假定θ1=1,后面还是会变的,我们要做多个假设来拟合出曲线),我们取3个样本点分别是(1,1),(2,2),(3,3)我们将数据代入上面的公式:由图可知真实值是0,预测值也是0,(画×的地方是真实值,函数值是预测值)代价函数:1/6 * (0+0+0)=0  画出右图



python 一元线性回归求残差 一元线性回归python代码_python 线性回归_10

这个我们假设θ1=0.5  大概算一下代价函数是:

1/6 * [(1-0.5)² +(2-1)² +(3-1.5)²] ≈0.6  

在右图画出,下面的自己做



python 一元线性回归求残差 一元线性回归python代码_python 一元线性回归求残差_11

经过无数个θ1的改变,我们可以拟合出一条代价函数



python 一元线性回归求残差 一元线性回归python代码_python线性回归_12

这时候通过代价函数我们就能求出θ1和θ0

我们接下来来看这幅图,右边是二维的等高线图,画叉的地方数值都相等(等高线貌似是高一地理学的??我也不晓得)

python 一元线性回归求残差 一元线性回归python代码_python 一元线性回归求残差_13

红圈的位置是最小值



python 一元线性回归求残差 一元线性回归python代码_python线性回归_14

下面我们介绍一下相关系数(了解一下就可以)



python 一元线性回归求残差 一元线性回归python代码_python 线性回归_15

python 一元线性回归求残差 一元线性回归python代码_python求导_16


我们现在要介绍的梯度下降法,梯度下降法是一个优化算法,使用梯度下降法我们来不断地优化代价函数,使得代价函数的值不断变小,这是一个不断迭代的过程,我们通过不停的迭代改变θ1和θ0的值,最终使代价函数的值最小



python 一元线性回归求残差 一元线性回归python代码_python 回归_17

python 一元线性回归求残差 一元线性回归python代码_python 回归_18

python 一元线性回归求残差 一元线性回归python代码_python线性回归_19

看一下公式:=代表赋值的意思

学习率我们要采用一个合适值,学习率大小就是每次步长的大小

在迭代过程中我们来更新数值,J(θ1,θ0)这是代价函数,我们需要分别对θ1和θ0求导

我们要同步更新,不能异步更新

我们先考虑一个参数



python 一元线性回归求残差 一元线性回归python代码_python 线性回归_20

python 一元线性回归求残差 一元线性回归python代码_python线性回归_21

python 一元线性回归求残差 一元线性回归python代码_python线性回归_22

python 一元线性回归求残差 一元线性回归python代码_python 线性回归_23

python 一元线性回归求残差 一元线性回归python代码_python 回归_24

求导过程省略,如果不会就重新学习一下高等数学(我会考虑以后要不要更新,这玩意好像没法更。。。)

线性回归的代价函数是凸函数



python 一元线性回归求残差 一元线性回归python代码_python 回归_25

看这图,左边就是非凸函数,右边就是凸函数



python 一元线性回归求残差 一元线性回归python代码_python线性回归_26

凸函数就是可以走到全局最小值(采用梯度下降法),非凸函数有很多的局部极小值,也有个全局最小值

下节我们来看一下用Python如何实现

python 一元线性回归求残差 一元线性回归python代码_python 回归_27