线性回归(Linear Regression)

前言

已知x=(x ̂,f(x ̂))的N个观测值(x ̂1,f(x ̂1)),(x ̂2,f(x ̂2)),…,(x ̂N,f(x ̂N)),但不知(x ̂,f(x ̂)),这里f称为期望回归函数,试求(x ̂,f(x ̂)),这个问题为回归问题。
回归函数可以选择的表示很多。但是根据奥卡姆剃刀准则,应该选择简单而且又可行的回归函数。显然,如果可行,线性函数是最简单的回归函数。当回归函数F采用线性模型表示时,我们称这类模型为线性回归。

一元线性回归

一元线性方程有如下形式:
F ( x ^ ) = w x ^ + b F(\hat{x})=w\hat{x}+b F(x^)=wx^+b
其中,系数w,b∈R称为回归系数,根据类一致性准则,为了最小化D(f(X),F(X)),最常用的方法是采用最小二乘的形式,所以,一元线性回归函数的损失函数为:
D ( f ( X ) , F ( X ) ) = L ( w , b ) = 1 N ∑ k = 1 N ( w x ^ k + b − f ( x ^ k ) ) 2 D(f(X),F(X))=L(w,b)=\frac{1}{N}\sum\limits_{k=1}^{N}{{{(w{{{\hat{x}}}_{k}}+b-f({{{\hat{x}}}_{k}}))}^{2}}} D(f(X),F(X))=L(w,b)=N1k=1N(wx^k+bf(x^k))2
此时,求解一元线性回归函数的问题转化为一个优化问题,即求解:
arg ⁡ min ⁡ w , b   L ( w , b ) = arg ⁡ min ⁡ w , b   1 2 N ∑ k = 1 N ( w x ^ k + b − f ( x ^ k ) ) 2 \arg \underset{w,b}{\mathop{\min }}\,L(w,b)=\arg \underset{w,b}{\mathop{\min }}\,\frac{1}{2N}\sum\limits_{k=1}^{N}{{{(w{{{\hat{x}}}_{k}}+b-f({{{\hat{x}}}_{k}}))}^{2}}} argw,bminL(w,b)=argw,bmin2N1k=1N(wx^k+bf(x^k))2
为了最优化上述目标函数,对b和w求偏导,令导数为0,即:
∂ L ( w , b ) ∂ b = 0 , ∂ L ( w , b ) ∂ w = 0 \frac{\partial L(w,b)}{\partial b}=0,\frac{\partial L(w,b)}{\partial w}=0 bL(w,b)=0,wL(w,b)=0
可求得:
w = ∑ k = 1 N x ^ k f ( x ^ k ) − N x ˉ y ˉ ∑ k = 1 N x ^ 2 k − N x ˉ 2 w=\frac{\sum\limits_{k=1}^{N}{{{{\hat{x}}}_{k}}f({{{\hat{x}}}_{k}})-N\bar{x}\bar{y}}}{\sum\limits_{k=1}^{N}{{{{\hat{x}}}^{2}}_{k}-N{{{\bar{x}}}^{2}}}} w=k=1Nx^2kNxˉ2k=1Nx^kf(x^k)Nxˉyˉ
b = f ˉ − w x ˉ b=\bar{f}-w\bar{x} b=fˉwxˉ
其中, x ˉ = ∑ k = 1 N x ^ k N , f ˉ = ∑ k = 1 N f ( x ^ k ) N \bar{x}=\sum\limits_{k=1}^{N}{\frac{{{{\hat{x}}}_{k}}}{N},\bar{f}=\sum\limits_{k=1}^{N}{\frac{f({{{\hat{x}}}_{k}})}{N}}} xˉ=k=1NNx^k,fˉ=k=1NNf(x^k)

案例

假设我们试图对某一社区中个人的受教育程度(用x表示)对年平均收入(用f(x)表示)的影响进行研究。我们从该社区中随机收集到11名个体的受教育年限(单位:年)和年平均收入(单位:千元)数据(见下表)。请利用该数据判断最佳线性回归模型。(精确到小数点后两位)
表 ——某小区11名个人的年平均收入与受教育年限

受教育年限x/年61099161216510128
年平均收入f(x)/千元5766918135101210

解:因为已知数据只有一个输入特征,所以设回归函数为y=wx+b,利用上述公式计算w和b。
x ˉ = ( 6 + 10 + 9 + 9 + 16 + 12 + 16 + 5 + 10 + 12 + 8 ) / 11 = 10.27 \bar{x}=(6+10+9+9+16+12+16+5+10+12+8)/11=10.27 xˉ=(6+10+9+9+16+12+16+5+10+12+8)/11=10.27
f ˉ = ( 5 + 7 + 6 + 6 + 9 + 8 + 13 + 5 + 10 + 12 + 10 ) / 11 = 8.27 \bar{f}=(5+7+6+6+9+8+13+5+10+12+10)/11=8.27 fˉ=(5+7+6+6+9+8+13+5+10+12+10)/11=8.27
∑ k = 1 11 x ^ k f ( x ^ k ) = 6 × 5 + 10 × 7 + . . . + 8 × 10 = 1005 \sum\limits_{k=1}^{11}{{{{\hat{x}}}_{k}}f({{{\hat{x}}}_{k}})=6\times 5+10\times 7+...+8\times 10=1005} k=111x^kf(x^k)=6×5+10×7+...+8×10=1005
∑ k = 1 11 x ^ 2 k = 6 2 + 10 2 + . . . + 8 2 = 1287 \sum\limits_{k=1}^{11}{{{{\hat{x}}}^{2}}_{k}={{6}^{2}}+{{10}^{2}}+...+{{8}^{2}}=1287} k=111x^2k=62+102+...+82=1287
所以,
w = ∑ k = 1 11 x ^ k f ( x ^ k ) − 11 x ˉ f ˉ ∑ k = 1 11 x ^ 2 k − 11 x ˉ 2 = 1005 − 11 × 10.27 × 8.27 1287 − 11 × 10.27 2 = 70.74 126.80 = 0.56 w=\frac{\sum\limits_{k=1}^{11}{{{{\hat{x}}}_{k}}f({{{\hat{x}}}_{k}})-11\bar{x}\bar{f}}}{\sum\limits_{k=1}^{11}{{{{\hat{x}}}^{2}}_{k}-11{{{\bar{x}}}^{2}}}}=\frac{1005-11\times 10.27\times 8.27}{1287-11\times {{10.27}^{2}}}=\frac{70.74}{126.80}=0.56 w=k=111x^2k11xˉ2k=111x^kf(x^k)11xˉfˉ=128711×10.272100511×10.27×8.27=126.8070.74=0.56
b = f ˉ − w x ˉ = 8.27 − 0.56 × 10.27 = 2.52 b=\bar{f}-w\bar{x}=8.27-0.56\times 10.27=2.52 b=fˉwxˉ=8.270.56×10.27=2.52
故所求的线性回归方程为:
F ( x ^ ) = 0.56 x ^ + 2.52 F(\hat{x})=0.56\hat{x}+2.52 F(x^)=0.56x^+2.52

线性回归的推广

多项式回归

回到我们开始的线性模型, 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,如果这里不仅仅是x的一次方,比如增加二次方,那么模型就变成了多项式回归。这里写一个只有两个特征的p次方多项式回归的模型:
h θ ( x 1 , x 2 ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 1 2 + θ 4 x 2 2 + θ 5 x 1 x 2 h_\theta(x_1, x_2) = \theta_0 + \theta_{1}x_1 + \theta_{2}x_{2} + \theta_{3}x_1^{2} + \theta_{4}x_2^{2} + \theta_{5}x_{1}x_2 hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x12+θ4x22+θ5x1x2
我们令 x 0 = 1 , x 1 = x 1 , x 2 = x 2 , x 3 = x 1 2 , x 4 = x 2 2 , x 5 = x 1 x 2 x_0 = 1, x_1 = x_1, x_2 = x_2, x_3 =x_1^{2}, x_4 = x_2^{2}, x_5 = x_{1}x_2 x0=1,x1=x1,x2=x2,x3=x12,x4=x22,x5=x1x2,,这样我们就得到了下式:
h θ ( x 1 , x 2 ) = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + θ 4 x 4 + θ 5 x 5 h_\theta(x_1, x_2) = \theta_0 + \theta_{1}x_1 + \theta_{2}x_{2} + \theta_{3}x_3 + \theta_{4}x_4 + \theta_{5}x_5 hθ(x1,x2)=θ0+θ1x1+θ2x2+θ3x3+θ4x4+θ5x5
可以发现,我们又重新回到了线性回归,这是一个五元线性回归,可以用线性回归的方法来完成算法。对于每个二元样本特征 ( x 1 , x 2 ) (x_1,x_2) (x1,x2),我们得到一个五元样本特征 ( 1 , x 1 , x 2 , x 1 2 , x 2 2 , x 1 x 2 ) (1, x_1, x_2, x_{1}^2, x_{2}^2, x_{1}x_2) (1,x1,x2,x12,x22,x1x2),通过这个改进的五元样本特征,我们重新把不是线性回归的函数变回线性回归。

广义线性回归

在上一节的线性回归的推广中,我们对样本特征端做了推广,这里我们对于特征y做推广。比如我们的输出Y不满足和X的线性关系,但是lnY 和X满足线性关系,模型函数如下:
l n Y = X θ ln\mathbf{Y} = \mathbf{X\theta} lnY=Xθ
这样对与每个样本的输入y,我们用 lny去对应, 从而仍然可以用线性回归的算法去处理这个问题。我们把 Iny一般化,假设这个函数是单调可微函数g(.),则一般化的广义线性回归形式是:
g ( Y ) = X θ 或 者 Y = g − 1 ( X θ ) \mathbf{g}(\mathbf{Y}) = \mathbf{X\theta}或者\mathbf{Y} = \mathbf{g^{-1}}(\mathbf{X\theta}) g(Y)=XθY=g1(Xθ)
这个函数g(.)我们通常称为联系函数。

线性回归的正则化

为了防止模型的过拟合,我们在建立线性模型的时候经常需要加入正则化项。一般有L1正则化和L2正则化。
线性回归的L1正则化通常称为Lasso回归,它和一般线性回归的区别是在损失函数上增加了一个L1正则化的项,L1正则化的项有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:  
J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) + α ∣ ∣ θ ∣ ∣ 1 J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha||\theta||_1 J(θ)=21(XθY)T(XθY)+αθ1
其中n为样本个数,α为常数系数,需要进行调优。 ∣ ∣ θ ∣ ∣ 1 ||\theta||_1 θ1为L1范数。
Lasso回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为0。增强模型的泛化能力。
线性回归的L2正则化通常称为Ridge回归,它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和Lasso回归的区别是Ridge回归的正则化项是L2范数,而Lasso回归的正则化项是L1范数。具体Ridge回归的损失函数表达式如下:
J ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) + 1 2 α ∣ ∣ θ ∣ ∣ 2 2 J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \frac{1}{2}\alpha||\theta||_2^2 J(θ)=21(XθY)T(XθY)+21αθ22
其中α为常数系数,需要进行调优。 ∣ ∣ θ ∣ ∣ 2 ||θ||_2 θ2为L2范数。
Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数,使得模型相对而言比较的稳定,但和Lasso回归比,这会使得模型的特征留的特别多,模型解释性差。
除了上面这两种常见的线性回归正则化,还有一些其他的线性回归正则化算法,区别主要就在于正则化项的不同,和损失函数的优化方式不同,这里就不累述了。

线性回归的python代码实现

点击这里,下载数据集
python完整代码:

#-*- coding:utf-8 -*-

import numpy as np
from pylab import *

def train_wb(X, y):
    """
    :param X:N*D的数据
    :param y:X对应的y值
    :return: 返回(w,b)的向量
    """
    if np.linalg.det(X.T * X) != 0:
        wb = ((X.T.dot(X).I).dot(X.T)).dot(y)
        return wb

def test(x, wb):
    return x.T.dot(wb)

def getdata():
    x = []; y = []
    file = open("ex0.txt", 'r')
    for line in file.readlines():
        temp = line.strip().split("\t")
        x.append([float(temp[0]),float(temp[1])])
        y.append(float(temp[2]))
    return (np.mat(x), np.mat(y).T)

def draw(x, y, wb):

    #画回归直线y = wx+b
    a = np.linspace(0, np.max(x)) #横坐标的取值范围
    b = wb[0] + a * wb[1]
    plot(x, y, '.')
    plot(a, b)
    show()

X, y = getdata()
wb = train_wb(X, y)
draw(X[:, 1], y, wb.tolist())

运行结果如图所示:
在这里插入图片描述

参考

https://blog.csdn.net/u014028027/article/details/72667733
https://www.cnblogs.com/pinard/p/6004041.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值