线性回归模型
其中,(x_0=1),(d)表示(x)的特征数量。
在给定训练集下,需要用学习算法确定参数( heta),使得模型的预测值(h(x))与真实值(y)尽可能接近。为了精确地描述这种接近程度,定义损失函数:
问题转化为选择一组( heta)使得(J( heta))最小,这里有2种求解方法:
- 梯度下降
- Normal Equation
梯度下降
梯度下降的motivation非常直观,首先随机选择一组参数( heta),接着沿(J( heta))下降最快的方向更新( heta),经过若干次迭代就有望找到令(J( heta))收敛的参数( heta):
将(J( heta))的偏导数代入即得到所谓的batch gradient descent更新规则:
其向量化表示为:
由于损失函数(J( heta))是凸二次函数,因此总能收敛到唯一的全局最小值。
batch gradient descent一次更新需要计算所有训练样本,开销较大,因此有同学提出了stochastic gradient descent,每遇到一个训练样本就进行一次参数更新:
stochastic gradient descent一般比batch gradient descent收敛快,但是有可能在(J( heta))的最优点附近振荡,永远无法收敛到精确最优。不过一般选择最优点附近的参数也可以接受,还可以通过递减学习率(alpha)确保其精确收敛。
值得一提的是:梯度下降算法存在“锯齿”效应,因此为了加速收敛,通常要进行归一化处理使得不同特征的尺度相近。
Normal Equation
除了用迭代的方式求解(J( heta))的最小值,还可以用数学工具直接求得闭式解。
为了简洁地表示后续求导,使得人生不要太过凌乱,我们首先研究下(J( heta))的向量表示:
假设训练集(X)和对应的标签(y)分别为:
由于(h_{ heta}(x^{(i)})=(x^{(i)})^T heta),所以有:
根据向量运算法则(x^Tx=sum_ix_i^2),终于得到了(J( heta))的简单点的表示:
利用高中数学导数的知识,只要求得(J( heta))关于参数( heta)的导数并令其为0,就大功告成了:
哦,高中数学好像不太够,还要知道(a^Tb=b^Ta, abla_{x}Ax=A^T, abla_{x}x^TAx=(A+A^T)x)。
结束了无聊的数学推导,所谓的Normal Equation就来了:
我们暂时先不考虑(X^TX)不可逆的情况,最终的解析解就是( heta=(X^TX)^{-1}X^Ty)。这种方法不需要做Feature Scaling,但是只能用于容易求解的模型。
Probabilistic view
当观测数据满足一些假设条件时,就可以自然而然地推导出均方误差形式的损失函数。
假设观测数据满足:
其中,(epsilon^{(i)})表示偏差项,并且(epsilon^{(i)})服从IID的高斯分布,即(epsilon^{(i)}sim mathcal{N}(0, sigma^2))。
在满足上述假设的条件下,给定(x^{(i)}),观测到的(y^{(i)})满足概率分布(y^{(i)}|x^{(i)}; hetasim mathcal{N}( heta^Tx^{(i)}, sigma^2)),即:
我们希望选择合适的参数( heta),使得在整个训练集上最大化观测数据出现的概率,也就是所谓的极大似然估计:
To make our life easier,采用对数似然函数的形式去求(L( heta))的最大值:
因此,最大化(L( heta))与最小化(J( heta)=frac{1}{2}sum_{i=1}^{n}(h_{ heta}(x^{(i)})-y^{(i)})^2)等价,也就证明了均方误差损失函数的合理性。
值得一提的是:上述假设并不唯一,存在其它合理的假设同样能够证明均方误差作为损失函数的合理性。
局部加权线性回归
在朴素的线性回归中,训练模型得到的参数( heta)是固定的,对于每个要预测的点(x)计算( heta^Tx)就完事了。这种参数化的学习算法在预测时不需要训练数据的支持,非常快捷。
局部加权线性回归的motivation在于:朴素线性模型强行拟合所有训练样本,因为模型简单往往欠拟合。对于任意一个样本(x),如果只根据其周围几个样本来建立局部的线性模型,且距离(x)越近其在损失函数中的权值越大,就得到了所谓的Locally Weighted Linear Regression:
直观上看:如果一个点权值较大,其对损失函数的贡献就越大;如果权值较小,那么该点基本可以忽略不计。
权值一般会设计为指数函数:
其中,(x)表示待测试样本,( au)负责控制随距离增加权值的衰减快慢。
另外,与kNN类似,LWR也是一种懒惰学习算法,即只有给出测试样例时才会训练并预测。因此,这种非参数算法在预测时需要存储训练集,并且参数数量会随训练集大小线性增长。