ref. 《机器学习》周志华 P53

一、线性模型

线性模型(linear model)试图学得一个通过属性的线性组合来进行预测的函数,即

python 多元线性回归方程的拟合 python求多元线性回归方程_线性回归

线性模型形式简单,易于建模。w直观表达了各个属性在预测任务中的重要性,因此线性模型有很好的可解释性(comprehensibility)。

二、(多元)线性回归

1. 问题的提出

给定数据集D如下:

python 多元线性回归方程的拟合 python求多元线性回归方程_线性回归_02

python 多元线性回归方程的拟合 python求多元线性回归方程_python 多元线性回归方程的拟合_03

python 多元线性回归方程的拟合 python求多元线性回归方程_拟合_04

则(多元)线性回归试图学得

python 多元线性回归方程的拟合 python求多元线性回归方程_线性回归_05

,使得

python 多元线性回归方程的拟合 python求多元线性回归方程_python 多元线性回归方程的拟合_06

,其中

python 多元线性回归方程的拟合 python求多元线性回归方程_线性模型_07

={w1;w2;……;wd;b}。

为进行向量化计算,将数据表示为X,每行对应一个样本,如下所示。在每个样本最后增加元素“1”,是为了用于拟合f()里的偏置b。

python 多元线性回归方程的拟合 python求多元线性回归方程_拟合_08

则现在要拟合的函数为f(X)=

python 多元线性回归方程的拟合 python求多元线性回归方程_python 多元线性回归方程的拟合_09


2. 问题求解

① 目标

确定

python 多元线性回归方程的拟合 python求多元线性回归方程_拟合_10

的关键在于如何衡量f(x)与y之间的差别,通常使用均方误差作为性能度量,使其最小化作为目标,即,

python 多元线性回归方程的拟合 python求多元线性回归方程_拟合_11

这种基于均方误差最小化来进行模型求解的方法称为“最小二乘法”。

② XTX是满秩矩阵的情况:

 同样为了向量化计算,需要把y也表示为向量的形式,

python 多元线性回归方程的拟合 python求多元线性回归方程_线性回归_12

。则问题求解的目标如(3.9)所示。

python 多元线性回归方程的拟合 python求多元线性回归方程_线性模型_13

当XTX为满秩矩阵或正定矩阵时,式(3.10)推导出式(3.11)略。

式(3.11)是我们求解参数w,b的关键公式。

③ XTX不是满秩矩阵的情况:

在现实任务中的往往遇到X的属性个数大于样本个数的情况,即XTX不是满秩矩阵,此时用上述方法会得到多个

python 多元线性回归方程的拟合 python求多元线性回归方程_拟合_14

,且它们都能使均方误差最小化,选择哪一个解作为输出,将由学习算法的归纳偏好决定。常见的做法是引入正则化项,可参考岭回归、LASSO、Elastic Net等(我上篇博文有简单介绍)。

三、我的笔记

我最近的工作中,领导给出的任务是拟合一个包含7个样本,每个样本7个属性的数据集,其实就是一个7个变量的7个方程组,要求方程组没有b。接到这个任务,立刻就想到了是用线性回归问题。在机器学习算法中,对待拟合的函数普遍都加了偏置b,在我这个要求不设置b的任务中,将“二、(多元)线性回归”的求解问题稍改变一下即可,如下:

X无需在最后一列增加元素“1”(因为无需拟合b),仍然使用式(3.11)进行

python 多元线性回归方程的拟合 python求多元线性回归方程_python 多元线性回归方程的拟合_15

的求解,这个

python 多元线性回归方程的拟合 python求多元线性回归方程_拟合_16

中不再含有b。

四、python代码

1. “二、(多元)线性回归”部分涉及的代码

# 线性回归 ref.《机器学习》.周志华.P55
def fitLM(X,Y):
    samplesize = np.size(X, 0)
    # 1. 样本最后一个元素置1
    X_b = np.ones([1, samplesize]).tolist()
    X = np.transpose(X).tolist()
    X.extend(X_b)
    X = np.transpose(X)

    # 2. 根据公式(3.11)求w*
    XT=np.transpose(X)
    equ1=np.linalg.inv(np.dot(XT,X))
    equ2=np.dot(XT,Y)
    w=np.dot(equ1,equ2)
    return w

2.  “三、我的笔记”部分涉及的代码

def fitLM(X,Y):
    samplesize = np.size(X, 0)
    
    # 2. 根据公式(3.11)求w*
    XT=np.transpose(X)
    equ1=np.linalg.inv(np.dot(XT,X))
    equ2=np.dot(XT,Y)
    w=np.dot(equ1,equ2)
    return w