目录
1. 学习目标
1. 简单线性回归:简单线性回归及最小二乘法的数据推导
2. 实践:简单线性回归实现及向量化应用
3. 多元线性回归:多选线性回归和正规方程解及实现
2. 简单线性回归与最小二乘法
2.1 什么是简单线性回归
所谓简单,是指只有一个样本特征,即只有一个自变量;所谓线性,是指方程是线性的;所谓回归,是指用方程来模拟变量之间是如何关联的[1],即找到一条直线,使其可以最大程度地拟合样本特征和样本标签之间的关系。

2.2 如何找到最佳的直线
在图2.1中,我们可能会画出许多条直线来描述特征与标签之间的关系。但是既然会存在多条直线,那就有可能比较出个优劣。而之前我们也说过,这条直线需要最大程度地拟合二者之间的关系即尽可能地拟合真实情况。因此,从这个角度入手,我们就可以找到量化分析不同直线的指标从而挑出最合适的那个。
对于一个样本点,我们根据直线方程都可以得到一个预测值
。直线方程能够尽可能地拟合真实情况,也就是说真实值
和预测值
之间的差距应尽量小。所有的样本的误差都小,说明直线方程拟合性好。而一条直线的具体表示又是由其斜率a和截距b来决定的。因此,这个问题就变成了当a与b取什么值时,样本误差最小。
由于描述样本误差的指标有很多,因此我们需要先挑选一个合适的。通常来说,为了防止出现正误差值和负误差值相抵的情况,使用绝对值来表示误差,即。可是,通过一个绝对值函数来求最小值往往会存在一个问题,那就是不能求导。因为绝对值函数不是一个处处可导的函数。为了保证函数可导从而方便通过导数找到最小值,我们自然想到使用
来替换绝对值。因此,此时对于所有的n个样本而言,误差函数就变成了
此时的误差函数也被称之为损失函数或者目标函数,能令损失函数最小的参数a和b也就是最佳直线的斜率和截距。这时,可以用令偏导数为0的方式求出满足条件的a和b。具体推导过程见2.5。结果如下:
2.3 千奇百怪的单样本损失函数
首先需要注意,这部分讲的损失函数不同于2.2中的简单线性回归模型的损失函数。这里的损失函数是对于单个样本而言的。损失函数是衡量预测模型预测期望结果表现的指标。损失函数越小,模型的鲁棒性越好[1]。常见的单样本损失函数有以下几种:
2.3.1 0-1损失函数
分类问题常用的损失函数,分类正确结果为0,错误为1。
2.3.2 平方损失函数
用来描述回归问题,为真实值与预测值差值的平方。误差值越大、惩罚力度越强,即对表现差的值更敏感。
2.3.3 绝对损失函数
可以用来描述回归问题,为真实值与预测值差的绝对值。
2.3.4 对数损失函数
可以用来描述分类问题。该损失函数用到了极大似然估计的思想。P(Y|X)通俗的解释就是:在当前模型的基础上,对于样本X,其预测值为Y,也就是预测正确的概率。由于概率之间的同时满足需要使用乘法,为了将其转化为加法,我们将其取对数。最后由于是损失函数,所以预测正确的概率越高,其损失值应该是越小,因此再加个负号取个反。
另外,需要说明的是,对于多样本的对数损失函数需要假设所有样本是相互独立的。
2.4 侧重不同的多样本风险函数
损失函数是针对于单个样本的,但是一个训练数据集中存在多个样本,多个样本会给出多个损失。此时应该如何进行选择呢?为了解决这个问题,于是引出了风险函数的概念[1]。
2.4.1 期望风险
期望风险是损失函数的期望,用来表达理论上模型f(x)关于联合分布P(x, y)的平均意义下的损失。又叫期望损失/风险函数。
2.4.2 经验风险
模型f(x)关于训练数据集的平均损失,称为经验风险或经验损失。其含义为:模型关于训练集的平均损失。具体来说就是将每个样本的损失加起来,然后平均一下。
可以观察到该公式与2.2中简单线性回归模型的损失函数之间的关系。事实上,经验风险最小的模型为最优模型。在训练集上最小经验风险最小,也就意味着预测值和真实值尽可能接近,模型的效果越好。因此,公式含义还可以解释为训练样本集中对数损失函数平均值的最小值。
期望风险是模型关于联合分布的期望损失,经验风险是模型关于训练样本数据集的平均损失。根据大数定律,当样本容量趋于无穷时,经验风险趋于期望风险。因此很自然地想到用经验风险去估计期望风险。
2.4.3 结构风险
由于训练样本个数有限,用经验风险去估计期望风险容易出现过拟合问题。因此需要对经验风险其进行修正。而结构风险指的是在经验风险上加上一个正则化项或者惩罚项 。这样便可以实现修正。
2.5 最小二乘法
最小二乘法源于法国数学家阿德里安的猜想:对于测量值来说,让总的误差的平方最小的就是真实值。这是基于,如果误差是随机的,应该围绕真值上下波动。
意思就是说,如果误差是随机的,那么能让总的误差最小的测量值就可以认为是真实值。
高斯证明过:如果误差的分布是服从正态分布的,那么最小二乘法得到的值就最有可能是真实的值。
那,什么是“二乘”呢?其实就是“平方”的意思。是不是有些恍然大悟,明白了最小二乘法用的是什么误差计算方式。其实就是2.2中提到的真实值与预测值差的平方。
现在,我们承接2.2中的问题:如何利用偏导数为0求出令损失函数最小的a和b?具体过程参考如下:
首先,求解b:
这里我们用样本均值来代替求和,即用和
来替换
和
。可得,
然后,求解a:
将代入到上式可得,
打开括号,整理得,
用同上的替换方式去除求和符号得,
2.6 简单线性回归的实现及应用(以波士顿房价数据为例)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
boston = datasets.load_boston()
X = boston.data[:, 12]
y = boston.target
X = X[y < 50].reshape(-1, 1)
y = y[y < 50].reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 2020)
fig, axs = plt.subplots(2, 1)
# 手动计算
a = (np.mean(X_train * y_train) - np.mean(X_train) * np.mean(y_train)) / \
(np.mean(X_train ** 2) - np.mean(X_train) ** 2)
b = np.mean(y_train) - a * np.mean(X_train)
print(a, b)
axs[0].scatter(X_test, y_test, c = 'b')
axs[0].plot(X_test, a * X_test + b, c = 'r')
# 调用sklearn模块
lr = LinearRegression()
lr.fit(X_train, y_train)
predictions = lr.predict(X_test)
print(lr.coef_[0], lr.intercept_)
axs[1].scatter(X_test, y_test, c = 'b')
axs[1].plot(X_test, predictions, c = 'r')
plt.show()
3. 多元线性回归
3.1 定义及损失函数
相对于简单线性回归,多元线性回归则是不再只考虑单一样本特征与样本标签的关系。此时,我们可以把含有m个特征的样本n个样本构成的总体X写成如下的矩阵形式:
其中,每一行的数据都是同一个样本的各个特征。另外,还可以发现第一列全部为1,这样做的目的是为了统一格式,将常数项系数纳入到X中可以得到更加简练的结果[3]。
而此时某样本的预测值表达式如下
如果将样本总体考虑在内的话,可以写成如下的矩阵形式
此时,我们仍然使用2.2中的损失函数的概念,则在多元线性回归中,写成矩阵形式的损失函数表达式为
同理,这里一样可以先打开括号然后再利用导数求最小值。只不过这里涉及到矩阵和向量的求导。相关的求导规则可以参考《the Matrix Cookbook》[5]。
这里略过过程,最后的结果是
关于该最优参数解的形式的进一步讨论见3.3。
3.2 多元线性回归的实现及应用(以波士顿房价数据为例)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
boston = datasets.load_boston()
X = boston.data
y = boston.target
X = X[y < 50]
y = y[y < 50]
# 手动计算
# 在数据第一列上添加1
X = np.concatenate((np.array([1] * X.shape[0]).reshape(-1, 1), X), axis = 1)
# 计算参数theta
theta = np.dot(np.linalg.inv(np.dot(X.T, X)), X.T).dot(y)
coef_ = theta[1:]
intercept_ = theta[0]
print(coef_, intercept_)
# 调用sklearn模块
lr = LinearRegression()
lr.fit(X, y)
predictions = lr.predict(X)
print(lr.coef_, lr.intercept_)
3.3 避免最优参数无解而引入的正则化处理
让我们再观察一下多元线性回归的最优参数解的形式:
学过线性代数的人应该知道,并非所有矩阵都是存在逆矩阵的。因此很有可能是不存在的。此时需要怎么办呢?
首先,我们需要知道在多元逻辑回归问题中为什么会出现这样的情况。实际上,不存在的原因就是所有的特征并不是相互独立的,即矩阵X并非是一个列满秩矩阵。从而
也可能不再是一个满秩矩阵。
因此,解决这个问题的一个方法就是尝试去除所有相关的特征,留下全部相互独立的特征。
不过,还有一个更加通用的方法:那就是在后面在加上一个正则项
,其中I为单位矩阵。此时最优参数解的形式就变成了
此时的必然是满秩的,因此参数一定是可求的。
4. 参考文献
1. https://mp.weixin.qq.com/s/ESKQKi_1K_WPXNistizDVw
2. https://mp.weixin.qq.com/s/siFRKWLhGOGJCCMjzB7R7A
3. https://mp.weixin.qq.com/s/gJU4oJufOFNF_I3MO7gYlA
4. 《机器学习》(周志华)第三章