线性回归模型
1. 问题描述
假设有m个样本,n维特征。样本集记为 { ( x 1 ( 0 ) , x 2 ( 0 ) , . . . x n ( 0 ) , y 0 ) , ( x 1 ( 1 ) , x 2 ( 1 ) , . . . x n ( 1 ) , y 1 ) , . . . ( x 1 ( m ) , x 2 ( m ) , . . . x n ( m ) , y n ) } \left\{ {(x_1^{(0)},x_2^{(0)},...x_n^{(0)},{y_0}),(x_1^{(1)},x_2^{(1)},...x_n^{(1)},{y_1}),...(x_1^{(m)},x_2^{(m)},...x_n^{(m)},{y_n})} \right\} {(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),yn)}
问题:对于一个新的样本 ( x 1 ( k ) , x 2 ( k ) , . . . x n ( k ) ) (x_1^{(k)},x_2^{(k)},...x_n^{(k)}) (x1(k),x2(k),...xn(k)),它对应的 y k {y_k} yk是多少呢?
若y是连续值-回归问题-线性回归模型,y是离散值-分类问题-逻辑回归模型。
样本特征是1维时-简单线性回归;样本特征是多维时-多元线性回归 → 线性表示的是直线/平面/…
2. 模型描述
待估计的模型为
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
θ
0
+
θ
1
x
1
+
.
.
.
+
θ
n
x
n
{h_\theta }({x_1},{x_2},...{x_n}) = {\theta _0} + {\theta _1}{x_1} + ... + {\theta _n}{x_n}
hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn
此处,
θ
i
{\theta _i}
θi为模型参数,
x
i
{x_i}
xi为每个样本的特征值。为简化问题,引入特征
x
0
=
1
{x_0} = 1
x0=1,则
h
θ
(
x
1
,
x
2
,
.
.
.
x
n
)
=
∑
i
=
0
n
θ
i
x
i
{h_\theta }(x_1, x_2,...x_n) = \sum\limits_{i = 0}^n {{\theta _i}} {x_i}
hθ(x1,x2,...xn)=i=0∑nθixi
矩阵形式
h
θ
(
X
)
=
X
θ
{h_{\bf{\theta }}}({\bf{X}}) = {\bf{X\theta }}
hθ(X)=Xθ
其中
[ x 1 ( 0 ) x 2 ( 0 ) . . . x n ( 0 ) x 1 ( 1 ) x 2 ( 1 ) . . . x n ( 1 ) . . . . . . . . . . . . x 1 ( m ) x 2 ( m ) . . . x n ( m ) ] \begin{bmatrix} x_1^{\left( 0 \right)} & x_2^{\left( 0 \right)} & ... & x_n^{\left( 0 \right)} \\ x_1^{\left( 1 \right)} & x_2^{\left( 1 \right)} & ... & x_n^{\left( 1 \right)} \\ ... & ... & ... & ... \\ x_1^{\left( m \right)} & x_2^{\left( m \right)} & ... & x_n^{\left( m \right)} \end{bmatrix} ⎣⎢⎢⎢⎡x1(0)x1(1)...x1(m)x2(0)x2(1)...x2(m)............xn(0)xn(1)...xn(m)⎦⎥⎥⎥⎤
θ = ( θ 0 , θ 1 , . . . , θ n ) T \theta = {({\theta _0},{\theta _1},...,{\theta _n})^T} θ=(θ0,θ1,...,θn)T
3. 模型求解
损失函数 - 均方误差(Q1. 为什么选均方误差?)
J
(
θ
0
,
θ
1
.
.
.
,
θ
n
)
=
∑
i
=
0
m
(
h
θ
(
x
0
,
x
1
,
.
.
.
x
n
)
−
y
i
)
2
J({\theta _0},{\theta _1}...,{\theta _n}) = \sum\limits_{i = 0}^m {({h_\theta }(} {x_0},{x_1},...{x_n}) - {y_i}{)^2}
J(θ0,θ1...,θn)=i=0∑m(hθ(x0,x1,...xn)−yi)2
矩阵形式
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
J({\bf{\theta }}) = {1 \over 2}{({\bf{X\theta }} - {\bf{Y}})^T}({\bf{X\theta }} - {\bf{Y}})
J(θ)=21(Xθ−Y)T(Xθ−Y)
模型求解 - 如何求得参数
θ
\theta
θ的值?
最小二乘法对应有两种:线性和非线性。线性最小二乘的解是closed-form (见3.1),而非线性最小二乘没有closed-form,通常用迭代法求解 (见3.2)。
正规方程法通常用来求解线性最小二乘问题。梯度下降法是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。高斯-牛顿法是另一种经常用于求解非线性最小二乘的迭代法)。
显然线性回归的拟合函数是线性的,所以可以用两种方法求解:正规方程法,迭代法。
3.1 正规方程法 - 线性最小二乘
求解过程
损失函数为
J
(
θ
)
=
1
2
(
X
θ
−
Y
)
T
(
X
θ
−
Y
)
J({\bf{\theta }}) = {1 \over 2}{({\bf{X\theta }} - {\bf{Y}})^T}({\bf{X\theta }} - {\bf{Y}})
J(θ)=21(Xθ−Y)T(Xθ−Y)
根据最小二乘法的原理,损失函数对θ向量求导取0。结果如下式:
∂
∂
θ
J
(
θ
)
=
X
T
(
X
θ
−
Y
)
=
0
{\partial \over {\partial {\bf{\theta }}}}J({\bf{\theta }}) = {{\bf{X}}^T}({\bf{X\theta }} - {\bf{Y}}) = 0
∂θ∂J(θ)=XT(Xθ−Y)=0
此处用到以下两个矩阵求导公式:
∂ ∂ X ( A X ) = A T {\partial \over {\partial X}}\left( {AX} \right) = {A^T} ∂X∂(AX)=AT
∂ ∂ X ( X T A X ) = 2 A X , A 为 对 称 阵 {\partial \over {\partial X}}\left( {{X^T}AX} \right) = 2AX, A为对称阵 ∂X∂(XTAX)=2AX,A为对称阵
对等式整理如下:
X
T
X
θ
=
X
T
Y
{{\bf{X}}^T}{\bf{X}}\theta {\rm{ = }}{{\bf{X}}^T}{\bf{Y}}
XTXθ=XTY
两边同时左乘
(
X
T
X
)
−
1
{\left( {{{\bf{X}}^T}{\bf{X}}} \right)^{{\rm{ - }}1}}
(XTX)−1,得到
θ
=
(
X
T
X
)
−
1
X
T
Y
\theta {\rm{ = }}{\left( {{{\bf{X}}^T}{\bf{X}}} \right)^{{\rm{ - }}1}}{{\bf{X}}^T}{\bf{Y}}
θ=(XTX)−1XTY
分析
求逆操作 - 求逆十分耗时(假设
X
T
X
{{\bf{X}}^T}{\bf{X}}
XTX尺寸n x n,特征数n超过1w时建议用迭代法),此外
X
T
X
{{\bf{X}}^T}{\bf{X}}
XTX的逆矩阵可能不存在
应用场景 - 拟合函数是线性时才可以用
3.2 梯度下降法
迭代法 - 在每一步update未知量逐渐逼近解,可以用于各种各样的问题(包括最小二乘),比如求的不是误差的最小平方和而是最小立方和。
求解过程
输入:损失函数 J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) J({\bf{\theta }}) = {1 \over 2}{({\bf{X\theta }} - {\bf{Y}})^T}({\bf{X\theta }} - {\bf{Y}}) J(θ)=21(Xθ−Y)T(Xθ−Y),初始值 θ \theta θ,步长 α \alpha α
损失函数的梯度:
∂
∂
θ
J
(
θ
)
=
X
T
(
X
θ
−
Y
)
{\partial \over {\partial \theta }}J\left( \theta \right){\rm{ = }}{{\bf{X}}^T}({\bf{X\theta }} - {\bf{Y}})
∂θ∂J(θ)=XT(Xθ−Y)
更新方程:
θ
=
θ
−
α
∂
∂
θ
J
(
θ
)
=
θ
−
α
X
T
(
X
θ
−
Y
)
\theta {\rm{ = }}\theta -\alpha {\partial \over {\partial {\bf{\theta }}}}J({\bf{\theta }}){\rm{ = }}\theta -\alpha {{\bf{X}}^T}({\bf{X\theta }} - {\bf{Y}})
θ=θ−α∂θ∂J(θ)=θ−αXT(Xθ−Y)
直到
Δ
θ
\Delta \theta
Δθ小于阈值
ε
\varepsilon
ε
Δ
θ
=
∂
∂
θ
J
(
θ
)
<
ε
\Delta \theta {\rm{ = }}{\partial \over {\partial \theta }}J\left( \theta \right) < \varepsilon
Δθ=∂θ∂J(θ)<ε
分析
梯度下降法VS最小二乘法:
- 梯度下降法是迭代求解,最小二乘法是计算解析解
- 梯度下降法需要选择步长和初始值,最小二乘法不需要
- 样本量小且存在解析解,选择最小二乘法
梯度下降法VS牛顿法:
- 两者都是迭代法
- 梯度下降法等效一阶泰勒展开,牛顿法等效二阶泰勒展开(Q2.为什么梯度反方向是函数值局部下降最快的方向?)
- 牛顿法收敛更快(Q3. 为什么?)
4. 线性回归模型-优缺点分析
优点:简单易用,易理解;
缺点:对非线性的数据拟合不好
5. code
算法调优 - 初始值选择,步长选择
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
# 1) 读取数据
# 从datasets导入数据
diabetes = datasets.load_diabetes()
# 只取第三列数据使用
diabetes_X = diabetes.data[:, np.newaxis, 2]
diabetes_X.shape # (442, 1)
#2) 划分训练集和测试集
# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
#3) 运行线性模型
regr = linear_model.LinearRegression()
regr.fit(diabetes_X_train, diabetes_y_train)
#4) 模型系数结果:
print('Coefficients-w: ', regr.coef_)
print('Interception-b:', regr.intercept_)
#5) 评价指标 - 均方差(Mean Squared Error, MSE)/ 均方根差(Root Mean Squared Error, RMSE)
diabetes_y_pred = regr.predict(diabetes_X_test)
# The mean squared error
print("Mean squared error: %.2f"% mean_squared_error(diabetes_y_test, diabetes_y_pred))
print("Root mean squared error: %.2f"% np.sqrt(mean_squared_error(diabetes_y_test, diabetes_y_pred)))
#6) 画出观察结果
# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
输出为
# 模型系数结果:
Coefficients-w: [938.23786125]
Interception-b: 152.91886182616167
# 评价指标
Mean squared error: 2548.07
Root mean squared error: 50.48
# 画出观察结果
6. 广义线性模型
输出和输入不是线性关系时,比如lnY和X满足线性关系,则模型如下:
ln
Y
=
X
θ
\ln Y = X\theta
lnY=Xθ
称为对数线性回归。
更一般的,考虑单调可微函数
g
(
.
)
g\left( . \right)
g(.),令
Y
=
g
−
1
(
X
θ
)
⇒
g
(
Y
)
=
X
θ
Y = {g^{ - 1}}\left( {X\theta } \right) \Rightarrow g\left( Y \right) = X\theta
Y=g−1(Xθ)⇒g(Y)=Xθ
这样得到的模型称为"广义线性模型"。显然,对数线性回归是
g
(
.
)
=
ln
(
.
)
g\left( . \right) = \ln \left( . \right)
g(.)=ln(.)的特例。而逻辑回归是广义线性模型下
g
(
.
)
=
s
i
g
m
o
i
d
(
.
)
g\left( . \right) = sigmoid\left( . \right)
g(.)=sigmoid(.)的特例。
7. 拓展 - 其他知识点
优化方法 - 梯度下降法(批量梯度下降/随机梯度下降/小批量梯度下降)、动量法、Adam等
正则项 - L1和L2区别、防止过拟合的方法?
Q&A
Q1. 为什么选均方误差?
- 为了回归分析,通常需要对随机误差项的概率分布做一些假设。误差服从高斯分布[PDF的指数项上包含差值平方],不考虑方差,然后利用最大似然估计,可以推出损失函数的表达式。(可以了解下高斯-马尔可夫定理)
- 最小二乘法的思想 - 选择未知参数,使得理论值与观测值之差的平方和达到最小(二乘就是平方的意思)
Q2.为什么梯度反方向是函数值局部下降最快的方向?
以一个二元函数为例 f ( x , y ) f\left( {x,y} \right) f(x,y),
1 - 梯度是函数在各坐标轴方向上的变化率,比如梯度 ∇ f ( x 0 , y 0 ) \nabla f\left( {{x_0},{y_0}} \right) ∇f(x0,y0)是函数在 ( x 0 , y 0 ) \left( {{x_0},{y_0}} \right) (x0,y0)上关于x轴和y轴的变化率
∇ f ( x , y ) = ( f x ( x , y ) f y ( x , y ) ) \nabla f\left( {x,y} \right) = \begin{pmatrix} {{f_x}\left( {x,y} \right)} \\ {{f_y}\left( {x,y} \right)} \end{pmatrix} ∇f(x,y)=(fx(x,y)fy(x,y))
2 - 对于一个任意单位方向 u = ( cos α , sin α ) T u = {\left( {\cos \alpha ,\sin \alpha } \right)^T} u=(cosα,sinα)T,假设 α \alpha α 是u和x轴的夹角,那么函数 f ( x , y ) f\left( {x,y} \right) f(x,y)在u这个方向上的变化率为
f x ( x , y ) cos α + f y ( x , y ) sin α = ∇ f ( x , y ) T ( cos α sin α ) = ∇ f ( x , y ) T u f_x(x,y) \cos \alpha + f_y(x,y) \sin \alpha=\nabla f(x,y)^T\begin{pmatrix}\cos \alpha\\ \sin \alpha\end{pmatrix}=\nabla f(x,y)^Tu fx(x,y)cosα+fy(x,y)sinα=∇f(x,y)T(cosαsinα)=∇f(x,y)Tu
也就是两个向量的点积。
3 - 我们知道向量点积的结果和向量本身的大小以及两者夹角相关,假设 ∇ f ( x 0 , y 0 ) \nabla f\left( {{x_0},{y_0}} \right) ∇f(x0,y0)和u的夹角为θ,那么函数 f ( x , y ) f\left( {x,y} \right) f(x,y)在u这个方向上的变化率可以写成
∇ f ( x , y ) T u = ∥ ∇ f ( x , y ) ∥ 2 ∥ u ∥ 2 cos θ = ∥ ∇ f ( x , y ) ∥ 2 cos θ \nabla f(x,y)^Tu=\|\nabla f(x,y)\|_2 \|u\|_2 \cos \theta=\|\nabla f(x,y)\|_2\cos \theta ∇f(x,y)Tu=∥∇f(x,y)∥2∥u∥2cosθ=∥∇f(x,y)∥2cosθ
4 - cos θ {\cos \theta } cosθ 的取值范围为[−1,1]。
当 cos θ = 1 \cos \theta = 1 cosθ=1时,函数变化率最大(上升最快),此时u和梯度 ∇ f ( x 0 , y 0 ) \nabla f\left( {{x_0},{y_0}} \right) ∇f(x0,y0)同方向;
当 cos θ = − 1 \cos \theta = -1 cosθ=−1时,函数变化率最小(下降最快),此时u是梯度 ∇ f ( x 0 , y 0 ) \nabla f\left( {{x_0},{y_0}} \right) ∇f(x0,y0)的反方向。
5 - 推广到n元函数,函数f在单位方向u的变化率为
∇ f T u \nabla f^T u ∇fTu
假设 ∇ f ( x , y ) \nabla f(x,y) ∇f(x,y)和u的夹角为 θ θ θ,同样函数f在u这个方向上的变化率可以写成
∇ f T u = ∥ ∇ f ∥ 2 ∥ u ∥ 2 cos θ = ∥ ∇ f ∥ 2 cos θ \nabla f^Tu=\|\nabla f\|_2\|u\|_2 \cos \theta=\|\nabla f\|_2\cos \theta ∇fTu=∥∇f∥2∥u∥2cosθ=∥∇f∥2cosθ
变化率由 cos θ \cos \theta cosθ决定。u和梯度 ∇ f ( x , y ) \nabla f(x,y) ∇f(x,y)同方向,上升最快;u和梯度 ∇ f ( x , y ) \nabla f(x,y) ∇f(x,y)反方向,下降最快。
Q3. 为什么牛顿法收敛更快?
通俗解释- 比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。
Wiki解释- 几何上来说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面。通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。
Ref
线性回归原理小结
为什么线性回归模型中要假设随机误差等方差并且服从正态分布?
线性模型与高斯-马尔科夫定理
为什么梯度反方向是函数值局部下降最快的方向?
知乎 - 最优化问题中,牛顿法为什么比梯度下降法求解需要的迭代次数更少?
sklearn官方文档