前言

已知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采用线性模型表示时,我们称这类模型为线性回归。

一元线性回归

一元线性方程有如下形式:
一元线性回归模型带e吗 一元线性回归f_python
其中,系数w,b∈R称为回归系数,根据类一致性准则,为了最小化D(f(X),F(X)),最常用的方法是采用最小二乘的形式,所以,一元线性回归函数的损失函数为:
一元线性回归模型带e吗 一元线性回归f_一元线性回归模型带e吗_02
此时,求解一元线性回归函数的问题转化为一个优化问题,即求解:
一元线性回归模型带e吗 一元线性回归f_一元线性回归模型带e吗_03
为了最优化上述目标函数,对b和w求偏导,令导数为0,即:
一元线性回归模型带e吗 一元线性回归f_一元线性回归模型带e吗_04
可求得:
一元线性回归模型带e吗 一元线性回归f_最小化_05
一元线性回归模型带e吗 一元线性回归f_最小化_06
其中,一元线性回归模型带e吗 一元线性回归f_python_07

案例

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

受教育年限x/年

6

10

9

9

16

12

16

5

10

12

8

年平均收入f(x)/千元

5

7

6

6

9

18

13

5

10

12

10

解:因为已知数据只有一个输入特征,所以设回归函数为y=wx+b,利用上述公式计算w和b。
一元线性回归模型带e吗 一元线性回归f_线性回归_08
一元线性回归模型带e吗 一元线性回归f_python_09
一元线性回归模型带e吗 一元线性回归f_线性回归_10
一元线性回归模型带e吗 一元线性回归f_python_11
所以,
一元线性回归模型带e吗 一元线性回归f_python_12
一元线性回归模型带e吗 一元线性回归f_线性回归_13
故所求的线性回归方程为:
一元线性回归模型带e吗 一元线性回归f_机器学习_14

线性回归的推广

多项式回归

回到我们开始的线性模型,一元线性回归模型带e吗 一元线性回归f_线性回归_15,如果这里不仅仅是x的一次方,比如增加二次方,那么模型就变成了多项式回归。这里写一个只有两个特征的p次方多项式回归的模型:
一元线性回归模型带e吗 一元线性回归f_最小化_16
我们令一元线性回归模型带e吗 一元线性回归f_线性回归_17,,这样我们就得到了下式:
一元线性回归模型带e吗 一元线性回归f_最小化_18
可以发现,我们又重新回到了线性回归,这是一个五元线性回归,可以用线性回归的方法来完成算法。对于每个二元样本特征一元线性回归模型带e吗 一元线性回归f_机器学习_19,我们得到一个五元样本特征一元线性回归模型带e吗 一元线性回归f_一元线性回归模型带e吗_20,通过这个改进的五元样本特征,我们重新把不是线性回归的函数变回线性回归。

广义线性回归

在上一节的线性回归的推广中,我们对样本特征端做了推广,这里我们对于特征y做推广。比如我们的输出Y不满足和X的线性关系,但是lnY 和X满足线性关系,模型函数如下:
一元线性回归模型带e吗 一元线性回归f_python_21
这样对与每个样本的输入y,我们用 lny去对应, 从而仍然可以用线性回归的算法去处理这个问题。我们把 Iny一般化,假设这个函数是单调可微函数g(.),则一般化的广义线性回归形式是:
一元线性回归模型带e吗 一元线性回归f_python_22
这个函数g(.)我们通常称为联系函数。

线性回归的正则化

为了防止模型的过拟合,我们在建立线性模型的时候经常需要加入正则化项。一般有L1正则化和L2正则化。
线性回归的L1正则化通常称为Lasso回归,它和一般线性回归的区别是在损失函数上增加了一个L1正则化的项,L1正则化的项有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体Lasso回归的损失函数表达式如下:  
一元线性回归模型带e吗 一元线性回归f_最小化_23
其中n为样本个数,α为常数系数,需要进行调优。一元线性回归模型带e吗 一元线性回归f_机器学习_24为L1范数。
Lasso回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为0。增强模型的泛化能力。
线性回归的L2正则化通常称为Ridge回归,它和一般线性回归的区别是在损失函数上增加了一个L2正则化的项,和Lasso回归的区别是Ridge回归的正则化项是L2范数,而Lasso回归的正则化项是L1范数。具体Ridge回归的损失函数表达式如下:
一元线性回归模型带e吗 一元线性回归f_线性回归_25
其中α为常数系数,需要进行调优。一元线性回归模型带e吗 一元线性回归f_线性回归_26为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())

运行结果如图所示:

一元线性回归模型带e吗 一元线性回归f_线性回归_27