给定一个大小为 n n n 的数据集 { y i , x i 1 , . . . , x i d } i = 1 n \{y_i,x_{i1},...,x_{id}\}_{i=1}^n {yi,xi1,...,xid}i=1n,其中 x i 1 , . . . , x i d x_{i1},...,x_{id} xi1,...,xid是第 i i i 个样本 d d d 个属性上的取值, y i y_i yi是该样本待预测的目标。线性回归模型假设目标 y i y_i yi 可以被属性间的线性组合描述,即:
y i = ω 1 x i 1 + ω 2 x i 2 + … + ω d x i d + b , i = 1 , … , n y_i=ω_1x_{i1}+ω_2x_{i2}+…+ω_dx_{id}+b, \quad i=1,…,n yi=ω1xi1+ω2xi2+…+ωdxid+b,i=1,…,n
例如,在我们将要建模的房价预测问题里, x i j x_{ij} xij 是描述房子 i i i 的各种属性(比如房间的个数、周围学校和医院的个数、交通状况等),而 y i y_i yi 是房屋的价格。
初看起来,这个假设实在过于简单了,变量间的真实关系很难是线性的。但由于线性回归模型有形式简单和易于建模分析的优点,它在实际问题中得到了大量的应用。很多经典的统计学习、机器学习书籍也选择对线性模型独立成章重点讲解。
为了推导模型,在假设数据满足线性模型条件下,可以设定线性模型如下:
h θ ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ⋯ = ∑ i = 0 n θ i x i = θ T x = X W h_{\theta}(x) = {\theta}_0 + {\theta}_1x_1 + {\theta}_2x_2 + \dots= \sum\limits_{i=0}^n {\theta}_ix_i = {\theta}^Tx = XW hθ(x)=θ0+θ1x1+θ2x2+⋯=i=0∑nθixi=θTx=XW
其中 x 1 x_1 x1特征为商品的大小, x 2 x_2 x2特征为商品的价格。模型假定好后,我们把训练数据代入上面的设定模型中,可以通过模型预测一个样本最终值。
y ( i ) = θ T x ( i ) + ϵ ( i ) y^{(i)} = {\theta}^Tx^{(i)} + {\epsilon}^{(i)} y(i)=θTx(i)+ϵ(i)
其中 y ( i ) y^{(i)} y(i) 表示真实值,$ {\theta}Tx{(i)} 表 示 估 计 值 , 表示估计值, 表示估计值,{\epsilon}^{(i)}$表示真实值与估计值之间的误差
假设训练样本的数据量很大的时候,根据中心极限定律可以得到 ∑ ϵ \sum \epsilon ∑ϵ 满足 ( u , σ 2 ) (u,{\sigma}^2) (u,σ2) 高斯分布的;由于方程有截距项 ,故 u =0; 故满足(0,δ²)的高斯分布。
所以 ϵ ( i ) {\epsilon}^{(i)} ϵ(i)的概率分布如下:
p ( ϵ ( i ) ) = 1 2 π σ e x p ( − ϵ ( i ) 2 2 σ 2 ) p({\epsilon}^{(i)}) = \frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{{{\epsilon}^{(i)}}^2}{2{\sigma}^2}) p(ϵ(i))=2πσ1exp(−2σ2ϵ(i)2)
由式(4)得: ${\epsilon}^{(i)} = y^{(i)} - {\theta}Tx{(i)} $
所以:
p ( y i ∣ x i ; θ ) = 1 2 π σ e x p ( − y ( i ) − θ T x ( i ) 2 2 σ 2 ) p(y^{i}|x^{i};\theta) = \frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{{{y^{(i)} - {\theta}^Tx^{(i)}}}^2}{2{\sigma}^2}) p(yi∣xi;θ)=2πσ1exp(−2σ2y(i)−θTx(i)2)
如上面可知,对于每一个样本 x x x ,代入到 式(5)都会得到一个 y y y 的概率;又因为设定样本是独立同分布的,对其求最大似然函数:
KaTeX parse error: No such environment: eqnarray* at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲*̲}̲ L(\theta) …
对其化简如下 :
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ \ell (\theta) …
又因为优化不用考虑定值,令 h θ ( x ( i ) ) = θ T x ( i ) h_{\theta}(x^{(i)}) = {\theta}^Tx^{(i)} hθ(x(i))=θTx(i),所以可以简化为对下式的优化:
J ( θ ) = 1 2 ∑ i = 1 m ( y ( i ) − θ T x ( i ) ) 2 = 1 2 ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) 2 J (\theta) = \frac{1}{2}\sum\limits_{i=1}^m{(y^{(i)} - {\theta}^Tx^{(i)}})^2=\frac{1}{2}\sum\limits_{i=1}^m{(y^{(i)} -h_{\theta}(x^{(i)}}))^2 J(θ)=21i=1∑m(y(i)−θTx(i))2=21i=1∑m(y(i)−hθ(x(i)))2
以上就得到了回归的损失函数最小二乘法的公式,对于好多介绍一般对线性回归的线性损失函数就直接给出了上面的公式二乘法。下面我们就对上面做了阶段性的总结:线性回归,根据大数定律和中心极限定律假定样本无穷大的时候,其真实值和预测值的误差 ϵ \epsilon ϵ 的加和服从 ( u , σ 2 ) (u,{\sigma}^2) (u,σ2) 的高斯分布且独立同分布,然后把 ${\epsilon}^{(i)} = y^{(i)} - {\theta}Tx{(i)} $ 代入公式,就可以化简得到线性回归的损失函数。
对损失函数进行优化,也就是求出w,b,使的损失函数最小化。
梯度下降法:如图可以理解为先假设一定点,然后按一定的步长顺着这个点的梯度进行更新,迭代下去;最后能找到一个局部最优点,使优化函数在这个局部是最小值。
LMS algorithm(也叫Widrow-Hoff learning rule)
由前面可知,优化模型即选择合适的 θ \theta θ 使得 J ( θ ) J(\theta) J(θ) 最小化。我们随机初始化 θ \theta θ ,用下面的式子对 θ \theta θ 进行重复更新。
θ j : = θ j − α ∂ J ( θ ) ∂ θ j , j = 0 , … , n {\theta}_j: = {\theta}_j - \alpha \frac{\partial{J(\theta)}}{\partial{{\theta}_j}},\qquad j = 0,\dots,n θj:=θj−α∂θj∂J(θ),j=0,…,n
其中 α \alpha α 是学习率,也叫步长。表示在 J J J 下降最陡的方向上前进一步的距离。
其中 J ( θ ) J(\theta) J(θ) 可由式(10)得到,对偏导数部分进行化简。假设现在只有单个训练样本 ( x , y ) (x,y) (x,y) ,则求偏导时, J ( θ ) J(\theta) J(θ) 中的求和符号便可去掉。
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ \frac{\partial…
所以对于单个训练样本 ( x , y ) (x,y) (x,y),参数 θ \theta θ 的更新规则为:
θ j : = θ j − α ( y − h θ ( x ) ) x j {\theta}_j: = {\theta}_j - \alpha (y-h_{\theta}(x))x_j θj:=θj−α(y−hθ(x))xj
由上式可以看出,当误差 $ y-h_{\theta}(x)$ 很小时,没有必要再更新参数 θ \theta θ ;相反,当参数改变太大时,意味着预测值与真实值之间的相差比较大。
当训练样本不止一个时,有两种优化方法batch gradient descent和stochastic gradient descent (also incremental gradient descent)
batch gradient descent
Repeat until convergence {
θ j : = θ j − α ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) x j ( i ) {\theta}_j: = {\theta}_j - \alpha \sum\limits_{i=1}^m(y^{(i)}-h_{\theta}(x^{(i)}))x_j^{(i)} θj:=θj−αi=1∑m(y(i)−hθ(x(i)))xj(i)
}
stochastic gradient descent (also incremental gradient descent)
Loop {
for i =1 to m, {
${\theta}_j: = {\theta}_j - \alpha (y{(i)}-h_{\theta}(x{(i)}))x_j^{(i)} \qquad $(for every j)
}
}
梯度下降的方法用迭代的方式求得 j ( θ ) j(\theta) j(θ) 的最小值,下面介绍一种简明的不需要迭代的方法——正则方程。它通过直接用 $J $ 对 θ j {\theta}_j θj 求偏导,令其等于0 来优化,而不是由单个训练样本推广。其实就是对矩阵求偏导,需要满足可逆条件。
假设训练样本 X X X 为 m × n m \times n m×n (actually m × n + 1 m \times n + 1 m×n+1 , if we include the intercept term),将 X X X 和 y y y 保存为如下格式:
X = [ ( x ( 1 ) ) T ( x ( 2 ) ) T ⋮ ( x ( m ) ) T ] y ⃗ = [ y ( 1 ) y ( 2 ) ⋮ y ( m ) ] X = \begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T \\ \vdots \\ (x^{(m)})^T \end{bmatrix} \quad \vec y = \begin{bmatrix} y^{(1)} \\ y^{(2)} \\ \vdots \\ y^{(m)} \end{bmatrix} X=⎣⎢⎢⎢⎡(x(1))T(x(2))T⋮(x(m))T⎦⎥⎥⎥⎤y=⎣⎢⎢⎢⎡y(1)y(2)⋮y(m)⎦⎥⎥⎥⎤
注:本文中所有向量均为列向量。
因为 h θ ( x ( i ) ) = ( x ( i ) ) T θ h_{\theta}(x^{(i)}) = {(x^{(i)})}^T {\theta} hθ(x(i))=(x(i))Tθ ,所以可以定义:
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ X \theta - \ve…
又因为对于列向量向量 z z z, 有 z T z = ∑ i z i 2 z^Tz = \sum\limits_i z_i^2 zTz=i∑zi2 ,所以:
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ \frac{1}{2}(\v…
因此:
KaTeX parse error: No such environment: eqnarray at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲}̲ \nabla_{\theta…
上面的第三个式子(式26)是因为 实数的迹仍为实数。矩阵求导见矩阵的迹和导数的主要性质。
令 ∇ θ J ( θ ) = 0 \nabla_{\theta}J(\theta) = 0 ∇θJ(θ)=0 ,则 $ X^TX\theta = X^T\vec y . $
⇒ θ = ( X T X ) − 1 X T y ⃗ \Rightarrow \qquad \theta = (X^TX)^{-1}X^T\vec y ⇒θ=(XTX)−1XTy
以上就是按矩阵方法优化损失函数,但上面方法有一定的局限性,就是要可逆。
###3.Python实现
####(1)代码:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import numpy as np
import warnings
from sklearn.exceptions import ConvergenceWarning
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression,RidgeCV,LassoCV,ElasticNetCV
import matplotlib as mpl
import matplotlib.pyplot as plt
if __name__ == "__main__":
warnings.filterwarnings(action='ignore', category=ConvergenceWarning)
np.random.seed(0)
np.set_printoptions(linewidth=1000)
N = 9
x = np.linspace(0, 6, N) + np.random.randn(N)
x = np.sort(x)
y = x**2 - 4*x - 3 + np.random.randn(N)
x.shape = -1, 1
y.shape = -1, 1
p =Pipeline([
('poly', PolynomialFeatures()),
('linear', LinearRegression(fit_intercept=False))])
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
np.set_printoptions(suppress=True)
plt.figure(figsize=(8, 6), facecolor='w')
d_pool = np.arange(1, N, 1) # 阶
m = d_pool.size
clrs = [] # 颜色
for c in np.linspace(16711680, 255, m):
clrs.append('#%06x' % c)
line_width = np.linspace(5, 2, m)
plt.plot(x, y, 'ro', ms=10, zorder=N)
for i, d in enumerate(d_pool):
p.set_params(poly__degree=d)
p.fit(x, y.ravel())
lin = p.get_params('linear')['linear']
output = u'%s:%d阶,系数为:' % (u'线性回归', d)
print output, lin.coef_.ravel()
x_hat = np.linspace(x.min(), x.max(), num=100)
x_hat.shape = -1, 1
y_hat = p.predict(x_hat)
s = p.score(x, y)
z = N - 1 if (d == 2) else 0
label = u'%d阶,$R^2$=%.3f' % (d, s)
plt.plot(x_hat, y_hat, color=clrs[i], lw=line_width[i], alpha=0.75,label=label, zorder=z)
plt.legend(loc='upper left')
plt.grid(True)
# plt.title('线性回归', fontsize=18)
plt.xlabel('X', fontsize=16)
plt.ylabel('Y', fontsize=16)
plt.show()
斯坦福机器学习课程Lecture 1(cs229-notes1)
深入梯度下降(Gradient Descent)算法
线性回归原理和实现基本认识
PaddlePadlle Document