1.简单线性回归概念
线性回归是一种用于预测连续值输出的监督学习算法。它的核心思想是找到一个线性函数,该函数能尽可能好地拟合输入特征与输出目标之间的关系。
2.多元线性回归概念
例如:
线性回归模型可以看作是在二维空间中寻找一条直线,在三维空间中寻找一个平面,在更高维空间中寻找一个超平面,来最好地拟合数据点。
线性回归模型的基本形式是一个线性方程:\(h_{\theta}(x)=\theta_0+\theta_1x_1+\theta_2x_2+...+\theta_nx_n=\sum_{i=0}^n\theta_ix_i=\theta^Tx\)
其中,\(x=[x_0, x_1, x_2,..., x_n]^T\)是特征向量,通常令\(x_0=1\)
\(\theta=[\theta_0, \theta_1, \theta_2,..., \theta_n]^T\)是模型参数(权重),\(\theta_0\)是偏置项(截距)。
3.正规方程
正规方程是一种在线性回归中用来直接求解模型参数 θ 的方法,而不需要使用迭代优化算法(如梯度下降)。
简单来说,它的核心思想是利用微积分的知识,通过将损失函数 J(θ) 对参数 θ 的偏导数设为零,来找到使损失函数最小化的 θ 值。
3.1最小二乘法矩阵表示
最小二乘法可以将误差方程转化为有确定解的代数方程组(其方程式数目正好等于未知数的个数),从而可求解出这些未知参数。这个有确定解的代数方程组称为最小二乘法估计的正规方程。公式如下:
公式是如何推导的?最小二乘法公式如下:
其中\(y_i\)是真实值,\(h_{\theta}(x_i)\)是预测值。\(\frac{1}{2}\)是一个常数,为了在求导时抵消掉平方的系数2,方便计算,不影响最终结果.这个公式的目的是找到一组参数 θ,使得预测值与真实值之间的平方误差之和最小。为了利用矩阵运算的优势(更简洁、更高效),我们可以求和公式改写为矩阵形式。
首先向量化表示:
损失函数 J(θ) 是所有误差平方的和。在向量代数中,一个向量的转置与其自身的乘积,即\(v^Tv\),就等于其所有元素的平方和!!!!
之所以要使用转置T,是因为,矩阵运算规律是:矩阵A的一行乘以矩阵B的一列!
转置操作 T
是将列向量转换为行向量,使其能够与原始的列向量相乘,从而得到标量形式的误差平方和。
3.2正规方程应用求解多元一次方程
比如二元一次方程:
验证:
1
2
inv_ = np.linalg.inv(X.T@X)
inv_@(X.T)@y
再例如下面的三元一次 方程:
1
2
3
X = np.array([[1, -1, 1], [2, 1, -1], [3, -2, 6]])
y = np.array([100, 80, 256])
np.linalg.solve(X, y)
同样也可以验证:
如果是恐怖的八元一次方程:
也是一样的道理。
3.3正规方程公式的推导
首先回顾基础:矩阵的转置和求导
为了方便求导,我们先展开 \((Xθ−y)^T(Xθ−y)\)。根据矩阵转置的性质\((AB)^T=B^TA^T\),我们有完整的推导过程
以上展开了损失函数。最终得到:
接下来对\(\theta\)求偏导。
为了找到使 J(θ) 最小的 θ,我们对 J(θ) 关于 θ 求偏导,并将其设为零,即:
分别对各项求导:
对第一项求导:
对第二项求导:
对第三项求导:
这一项不包含 θ,因此求导结果为0。
将这三项合并,得到最终的偏导数:
令偏导数等于零并求解 θ。
假设矩阵 \(X^TX\) 是可逆的,得到最终结果:
这就是正规方程的最终形式。
注意:这个推导过程假设了矩阵\(X^TX\)是可逆的。如果不可逆(例如,特征之间存在线性相关性),那么需要使用伪逆矩阵(pseudo-inverse)来解决。
3.4sklearn线性回归正规方程运算
如果每次都要求解方程的解,每次都需要用numpy运算
1
2
inv_ = np.linalg.inv(X.T@X)
inv_@(X.T)@y
公式记不住是一方面,另一方面代码也需要被复用。所以可以用sklearn求解正规方程的解。
sklearn
(Scikit-learn)是一个强大的机器学习库,它将这些复杂的数学运算封装在简洁易用的 API 中,大大提高了开发效率和代码的可读性。
sklearn.linear_model.LinearRegression
这个类就是用来实现线性回归的。它的背后,默认情况下,正是利用了正规方程来求解参数的!
先看案例:
对于刚才的方程组:
1
2
3
4
5
6
7
8
9
from sklearn.linear_model import LinearRegression
# 准备数据
X = np.array([[1, -1, 1], [2, 1, -1], [3, -2, 6]])
y = np.array([100, 80, 256])
# 实例化
model = LinearRegression(fit_intercept=False)
# 训练/求解 注意X一定是二维的
model.fit(X, y)
display(model.coef_, model.intercept_)
当你调用 model.fit(X, y)
时,sklearn
在内部执行了以下操作:
- 构造特征矩阵
X
和目标向量y
。 - 如果没有设置
fit_intercept=False
,它会为X
自动添加一列全为 1 的列,以表示截距项。 - 接着,它会使用类似于
(X.T @ X)^-1 @ X.T @ y
的数学方法来直接计算出最优的参数coef_
和intercept_
。
所以,sklearn
的 LinearRegression
模型就是对正规方程的优雅封装,它帮你完成了所有繁琐的矩阵运算,你只需要调用几个简单的方法即可。
3.5凸函数判定
判定损失函数是凸函数的好处在于我们可能很肯定的知道我们求得的极值即最优解,一定是全局最优解。
(1)什么是凸函数
从直观上看,一个函数是凸函数,意味着它的图像是一个“碗”状的形状,开口向上。
用数学语言来定义:如果一个函数 f(x) 满足,对于其定义域中的任意两点 x1 和 x2,以及任意一个在 [0, 1]
区间内的数 α,都有:
即上面右边的图绘制的情况。
这表示函数曲线上任意两点之间的连线段,总是在函数曲线的上方或曲线上。
与之相对的是非凸函数,它的图像可能有很多“波峰”和“波谷”,呈现出复杂的形状。
(2)凸函数的性质是什么?
如果是非凸函数,那就不一定可以获取全局最优解
凸函数最重要的性质是:局部极小值就是全局最小值。
- 局部极小值:在函数曲线的某个局部区域内,比它周围所有点的值都要小的点。
- 全局最小值:在整个函数定义域内,比所有其他点的值都小的点。
对于一个凸函数,它可能只有一个局部极小值,也可能在一段区域内都是平坦的(有无数个局部极小值),但所有这些局部极小值都具有相同的函数值,也就是全局最小值。
(3)机器学习中的实际意义?
在机器学习中,损失函数是用来衡量模型预测结果与真实值之间差异的函数。我们的目标就是通过调整模型的参数(如线性回归中的 θ),来最小化这个损失函数。
- 如果损失函数是凸函数:
- 我们使用梯度下降等优化算法时,无论我们从哪个随机的参数值开始,算法都能够保证收敛到全局最优解。
- 这给了我们极大的信心:我们找到的解就是最好的解,没有更好的解被遗漏。
- 线性回归的最小二乘法就是典型的凸损失函数,所以它的最优解是唯一的,且可以被轻松找到。
- 如果损失函数是非凸函数:
- 比如在神经网络中,损失函数通常是非凸的。
- 这时,梯度下降等算法可能会陷入局部最优解,而无法找到全局最优解。
- 这解释了为什么神经网络的训练结果会受到初始化参数、学习率等因素的影响。不同的随机初始化可能会让模型收敛到不同的局部最优解,从而导致模型性能的差异。
(4)二阶导数(海森矩阵)来判定一个损失函数是否为凸函数
海森矩阵是由多元函数的所有二阶偏导数组成的方阵。对于一个函数 f(x),其海森矩阵 H 的第 i 行第 j 列的元素是
如果一个函数的海森矩阵在定义域内处处是半正定矩阵,那么这个函数就是凸函数。半正定矩阵意味着,对于任意非零向量 z,都有
一阶导数以及推导得到了:(这与我们之前推导正规方程时得到的偏导数结果完全一致)
二阶导数 (海森矩阵):对上面这个结果再对\(\theta\)求导,根据矩阵求导的公式:
得到了:二阶导数就是\((X^TX)^T = X^TX\)
即:
为什么\(X^TX\) 是半正定的?即现在要证明下面命题:对于任意非零向量 z,我们来验证\(z^T(X^TX)z\) 的符号。
由于:
\((Xz)^T(Xz)\) 实际上是向量 Xz 与其自身的内积(点积),其结果是向量 Xz 的模(长度)的平方。任何向量的模的平方都大于或等于零。
因此,\(z^T(X^TX)z≥0\) 恒成立。
这证明了线性回归的损失函数的海森矩阵 \(X^TX\) 是半正定的,从而证明了线性回归的损失函数是凸函数。论我们从哪个随机的参数值开始,算法都能够保证收敛到全局最优解,我们找到的解就是最好的解,没有更好的解被遗漏。
在机器学习中损失函数都是凸函数,到深度学习中损失函数往往是非凸函数,即找到的解未必是全局最优,只要模型堪用就好!机器学习特点是:不强调模型100%正确,只要是有价值的,堪用的,就Okay!
线性模型:在线性回归、支持向量机等一些经典模型中,损失函数是凸函数。这使得我们可以确定性地找到全局最优解。
深度学习:在深度学习中,损失函数通常是非凸的。这意味着存在多个局部最优解,优化算法(如梯度下降)很可能陷入其中一个局部最优解。
实用主义:尽管深度学习无法保证找到全局最优,但在实践中,我们发现这些“局部最优解”通常已经足够好,能够使模型达到非常高的性能。因此,机器学习更注重模型的实际应用价值,而不是理论上的完美。
4.线性回归算法推导
4.1如何理解回归?
英国生物统计学家弗朗西斯·高尔顿(Francis Galton)最初提出“回归平均值”(regression to the mean)
他研究了遗传学,特别是父子身高之间的关系。他发现,尽管高个子的父亲倾向于生高个子的儿子,但儿子的身高往往会“回归”到人群的平均身高。同样,矮个子的父亲的儿子,其身高也倾向于比父亲高,向人群的平均身高回归。
这种现象并非是神秘力量,而是统计学上的一个基本现象。在任何具有随机性的系统中,极端值在下一代或下一次测量时往往会变得不那么极端,向均值靠拢。
高尔顿的发现激发了人们用数学模型来描述这种“回归”现象的兴趣。因此,回归分析(Regression Analysis)这一统计方法诞生了,它的核心目的就是找到一个函数,能够最好地描述一个或多个自变量(如父身高)与因变量(如子身高)之间的关系。
4.2误差分析与正态分布
提出一个核心假设,也是最小二乘法的理论基础之一:
- 独立性:每个样本的误差都是独立的,互不影响。
- 正态分布:误差服从均值为0、方差为某个定值的正态分布。
- 中心极限定理:这个假设的理论依据之一是中心极限定理。该定理指出,在足够多的独立随机变量的和(或平均值)的分布,会趋近于正态分布。
- 为什么均值是0?:这是因为我们假设模型能够捕获到数据的“平均”趋势,而误差则是围绕这个趋势的随机波动。如果均值不为0,意味着模型存在系统性偏差,可以通过调整截距项来消除。
下图就展示了正态分布图(高斯分布):
形状是钟形的,两头低中间高,代表了误差的分布。在均值(0)附近的误差出现的概率最高,而极端误差(离0很远)出现的概率非常低。
方差(\(\sigma^2\))越大,曲线越扁平,表明数据的离散程度越高
方差越小,曲线越尖峭,表明数据越集中在均值附近
【疑问】说了这么多,为什么要假设误差服从正态分布呢?这可是最小二乘法理论基础,不能说假设就随便假设吧,为什么不假设成其他分布?
- 原因1:中心极限定理的强有力支持
中心极限定理是概率论中的一个核心定理。它指出,当足够多的相互独立的随机变量相加时,其总和的分布会趋近于正态分布,而与这些随机变量本身的分布无关。在现实世界的回归问题中,模型的误差 ϵ 可以被看作是许多我们未观测到或未包含在模型中的独立小因素的综合影响。一个人的薪资误差可能受到情绪、家庭状况、交通、市场微小波动等无数个微小、独立的随机因素影响。这些因素的累积效应,根据中心极限定理,自然会形成一个近似正态分布的误差。
- 原因2:数学上的便利性
正态分布在数学上具有许多优良的性质,这使得它在推导和计算上非常方便。正态分布的均值、中位数和众数都相等,且分布关于均值对称。这使得我们可以假设误差的均值为0,即正误差和负误差出现的概率是相等的,没有系统性的偏差。后面会提到,在假设误差服从正态分布的前提下,最大似然估计(最大化观察到数据的概率)的求解过程正好等价于最小化误差的平方和。这种完美的数学巧合,使得最小二乘法的最优解具有强大的概率解释。如果没有正态分布这个假设,我们就无法得出这个结论。
- 原因3:正态分布的“最不偏”特性
在所有具有相同方差的概率分布中,正态分布拥有最大的熵(entropy)。熵在信息论中可以理解为不确定性。最大的熵意味着,在给定均值和方差的情况下,正态分布是最“不偏”或最“随机”的。换句话说,正态分布对模型的误差做了最少的、最合理的假设。它不假设误差有任何奇特的形状,只是假设它围绕一个中心值随机波动,这符合我们对未知误差的一般直觉。
- 原因4:易于进行统计推断
假设误差服从正态分布后,我们可以进行很多重要的统计推断,这些是线性回归分析的关键部分。我们可以对模型的参数(如 coef_
)进行假设检验,判断它们是否显著不为零。我们可以计算出模型参数的置信区间,从而估计参数的取值范围。我们可以计算出对新样本的预测区间,而不是仅仅给出一个点预测值。
- 总结:尽管现实中的误差可能不会完美地服从正态分布,但正态分布的假设为最小二乘法提供了坚实的理论基础、极大的数学便利性以及丰富的统计推断能力。它是最小二乘法能够如此广泛应用的核心原因之一。在实践中,如果模型的残差(误差)确实不满足正态分布,我们可以通过一些方法(如对数据进行转换)来改进模型,或者选择一个不依赖于正态分布假设的非参数模型。
4.3最大似然估计(Maximum Likelihood Estimation, MLE)
如果我们假设误差服从正态分布,那么我们就可以计算出在给定参数 θ 的情况下,观察到现有数据(即现有误差)的概率。
最大似然估计的目标是找到一组参数 θ,使得观察到当前数据集的总概率最大化。
这里有一个数学联系:正态分布的概率密度函数包含一个指数项
要使总概率(所有样本概率的乘积)最大化,就需要使指数项中的负数部分最小化。
而指数项中的负数部分正是
因此,最大化概率(最大似然)等价于最小化所有误差平方的和。
将“假设误差服从正态分布”的统计学思想,与“最小化误差平方和”的最小二乘法联系在了一起。这证明了在高斯分布的假设下,最小二乘法得到的解,就是概率上最有可能的解。
【场景】有一个装有黑白两种球的罐子,我们不知道黑球和白球的比例。通过有放回的抽样,估计罐子里白球所占的比例。我们从罐子里随机取一个球,记录颜色,然后放回,重复这个过程。假设我们重复了100次,其中有70次是白球,30次是黑球。
最大似然估计的理念:在所有可能的白球比例 p
中,哪个比例 p
最有可能产生我们观察到的这个结果(70次白球,30次黑球)?
我们的直觉会告诉我们,最有可能的比例就是70%。因为如果白球的比例是70%,那么我们抽到70次白球的概率最高。如果比例是50%或90%,那么抽到70次白球的概率反而会更低。
最大似然估计就是用数学方法来形式化这个直觉,找到使观察结果出现概率最大的那个参数值。
下面从数学的角度解释上面这个有返回的取球问题。
假设白球的比例是 p,黑球的比例是 1−p。抽一个球是白球的概率是 p。
抽两个球都是白球的概率是\(p×p=p^2\)(因为是独立事件,有放回)。同理,五个球都是白球的概率是 \(p^5\)。
现在考虑更复杂的情况:抽10个球,9个白球,1个黑球,概率是多少?这是一个二项分布问题。首先,抽到一个特定的序列(比如白白白白白白白白白黑)的概率是 \(p^9(1−p)^1\)。
但9个白球1个黑球的组合方式有很多种(黑球可以在10个位置中的任意一个),所以我们需要乘以组合数\(C_{10}^9\)。
最终概率是 \(P= C_{10}^9×p^9(1−p)^1\)。
现在回到原先的命题:总共抽取了100个球 (m=100),其中有70个白球 (k=70),30个黑球 (m−k=30)。我们可以写出观察到这个结果的似然函数(Likelihood Function),用 P 来表示:
补充回顾:似然函数:似然: 描述已经观察到事件 ( x ),而参数 ( \(\theta\) ) 是什么的可能性。
我们的目标是找到一个 p 的值,使得这个 L(p) 最大。
数学上来说就是对上面的L(p)求导,令:
L(p) 是关于 p 的函数,而 \(C_{100}^{70}\) 是一个常数,不影响函数极值点的位置,所以我们可以忽略它。所以我们只需最大化\(f(p)=p^{70}(1−p)^{30}\)。
为了简化计算,我们通常对似然函数取对数,因为对数函数是单调递增的,所以最大化对数似然函数等价于最大化似然函数本身。
对 ln(L(p)) 关于 p 求导:
令导数等于0, 即:
最终求得:p=70%
通过严格的数学推导,我们证明了直觉是正确的:在100次抽样中出现70次白球,那么白球比例最有可能是70%。
最大似然估计在机器学习中的意义:
- 它提供了一个通用的框架,用于估计模型参数。
- 在线性回归中,假设误差服从正态分布,那么最小化误差平方和(最小二乘法)就等价于最大化似然函数。
- 在逻辑回归中,我们假设数据服从伯努利分布,然后同样通过最大化似然函数来求解模型参数。
- 因此,最大似然估计是许多机器学习算法(尤其是概率模型)的理论基石。
4.4高斯分布-概率密度函数
正态分布(Normal Distribution),也被称为高斯分布(Gaussian Distribution),这个分布的概率密度函数 (PDF)如下:
这个公式描述了在给定均值 \(μ\) 和方差 \(σ^2\) 的情况下,随机变量 x 的概率密度。
图中,\(\mu\)在曲线的中心位置。它代表了数据的平均值或期望值。在图中,曲线的最高点就位于 \(x=μ\) 处。
方差用来衡量数据的离散程度。方差越大,曲线越扁平,数据越分散;方差越小,曲线越尖峭,数据越集中在均值附近。
\(\frac{1}{\sqrt(2 \pi \sigma^2)}\)是曲线高度的缩放因子,被称为归一化常数。它的作用是确保整个曲线下的面积总和为1,因为所有可能的概率之和必须为1。
条件概率表示法:
这个表示法强调了 f(x) 是在已知参数均值 \(μ\) 和方差 \(σ^2\) 的条件下的概率密度函数。这在最大似然估计中尤为重要,因为我们试图找到一组最佳参数来使概率最大化。
在最小二乘法中,我们假设误差 ϵ 服从正态分布。如果将正态分布的均值 \(μ\) 设置为0,即 \(f(ϵ∣μ=0,σ^2)\)。为什么可以置为0呢?这是因为我们认为线性回归模型已经很好地捕捉了数据的系统性趋势。剩下的误差 ϵ 应该是完全随机的,它围绕着0随机波动,正的误差和负的误差出现的可能性是相等的。如果误差的均值不为0,这意味着模型存在一个系统性偏差,我们可以通过调整模型的截距项来消除这个偏差,使其均值变为0。
于是得到下面的公式:
这里的 ϵ 代表了误差,而 x 在之前代表的是一个通用的随机变量。只是把\(x=ϵ\)
总结:将这个工具(高斯分布的概率密度函数)应用于误差 ϵ 上,并做出了关键的假设:误差服从均值为0的正态分布。
有了这个公式,我们就可以通过最大似然估计来推导出最小二乘法。
4.5误差总似然
和前面黑球白球问题类似,也是一个累乘问题。
为了使观察到所有误差 \(ϵ_1,ϵ_2,…,ϵ_m\) 的总概率最大,我们需要最大化它们的概率密度函数的乘积:
最大化这个乘积,等价于最小化指数项中的\(\sum_{i=1}^mϵ_i^2\),也就是最小化误差的平方和。
直接对包含累乘的函数求导非常复杂,对数函数是解决累乘求导困难的关键。
4.6最小二乘法MSE
现在已经将累乘形式的似然函数转化为累加形式的对数似然函数
根据对数性质 \(ln(AB)=ln(A)+ln(B)\) 和\(ln(A^B)=Bln(A)\),我们可以将公式展开:
所以 将最大化对数似然函数的问题,等价地转换成了最小化误差平方和的问题。
进一步简化对数似然函数:
在最大化这个对数似然函数时,我们关注的是与参数 W 相关的部分。
我们的目标是最大化 \(ln(P_W)\)。
由于第一项是常数,第二项前面有一个负号,所以最大化\(ln(P_W)\)就等价于最小化第二项中带负号的部分,即:
忽略掉常数 \(\frac{1}{2σ^2}\) 和负号后,我们得到了:
这就是最小二乘法损失函数的形式。其中,\(\frac{1}{2}\) 这个常数是为了方便求导而添加的,不影响最小化结果。
最大似然估计 (MLE)
+ 误差独立同正态分布 ⇒ 最小二乘法 (MSE)
这个过程是统计学与机器学习中一个非常重要的理论联系。
总结:假定了误差服从正态分布,并且误差是独立的,使用最大似然估计思想,利用损失函数最小化 MSE 就能求出最优解!
5.线性回归的评估方法
\(R^2\) 决定系数(Coefficient of Determination),是用来衡量回归模型对数据拟合优劣程度的一个指标。它的取值范围通常在0到1之间,但有时也可能为负。
可以这么理解: