第 6 章 线性回归
多变量线性回归是在单变量线性回归的基础上,引入多个特征。例如预测房价时,不只看面积,还可以同时考虑房间数、楼层、房龄等。
6.1 多维特征
单变量线性回归只有一个特征。多变量线性回归有多个特征,通常记作
新增符号:
| 符号 | 含义 |
|---|---|
n | 特征数量 |
第 i 个训练样本,是一个向量 | |
第 i 个训练样本的第 j 个特征 |
例如某个房屋样本可以写成:
多变量线性回归的假设函数:
为了让公式更统一,可以引入
此时参数 x 都可以看作向量,假设函数可以写成:
6.2 多变量梯度下降
多变量线性回归的代价函数仍然是所有训练样本预测误差的平方和:
其中:
目标仍然是找到一组参数,让代价函数最小。
批量梯度下降的更新规则:
其中 j = 0, 1, ..., n。
展开来看:
实现时从一组初始参数开始,计算预测结果和误差,再同步更新所有参数,不断重复直到收敛。
Python 中计算代价函数的示例:
def computeCost(X, y, theta):
inner = np.power(((X * theta.T) - y), 2)
return np.sum(inner) / (2 * len(X))6.3 梯度下降法实践 1:特征缩放
多变量问题中,不同特征的取值范围可能差异很大。例如房屋面积可能在 0 到 2000,房间数量可能在 0 到 5。
如果特征尺度差别太大,代价函数的等高线会很扁,梯度下降可能需要很多次迭代才能收敛。
解决方法是做特征缩放,让不同特征尽量落在相近范围内,常见目标范围是 -1 到 1。
常用做法是均值归一化:
其中:
表示当前处理的特征下标,避免和特征总数 混淆。 是第 j个特征的平均值。通常可以取第 j个特征的标准差或取值范围。
6.4 梯度下降法实践 2:学习率
梯度下降需要多少次迭代才能收敛,不能提前准确知道。通常可以画出迭代次数和代价函数的关系图,观察代价函数是否持续下降并趋于平稳。
如果学习率
如果学习率
课程中建议可以尝试这些学习率:
0.01, 0.03, 0.1, 0.3, 1, 3, 10调学习率时,要观察
6.5 特征和多项式回归
有时原始特征可以重新组合成更有意义的特征。
例如房价预测中,房子的临街宽度和纵向深度可以组合成面积:
area = frontage * depth这样就可以用面积作为一个新的特征。
线性模型并不适用于所有数据。有时需要用曲线拟合数据,例如二次模型或三次模型:
也可以根据房价随面积变化的形状,选择类似下面的模型:
或者:
如果使用多项式回归,特征缩放会更重要。因为平方、立方后的特征尺度可能变得非常大。
6.6 特征工程的补充
多变量线性回归的效果很依赖特征。模型形式虽然是线性的,但只要构造出合适的特征,也可以表达一部分非线性关系。
常见特征类型:
| 特征类型 | 例子 | 说明 |
|---|---|---|
| 数值特征 | 面积、年龄、收入 | 可以直接进入模型,但通常需要缩放 |
| 类别特征 | 城市、职业、房屋朝向 | 通常需要编码后再使用 |
| 交互特征 | 面积 × 房间数 | 表示两个特征一起产生的影响 |
| 多项式特征 | 用线性模型拟合曲线趋势 |
特征工程不是随便堆特征。特征太少,模型可能欠拟合;特征太多,模型可能过拟合,也可能让训练更不稳定。后面正则化章节会专门处理“特征多、模型复杂”带来的问题。
6.7 多重共线性和特征缩放
如果两个特征高度相关,例如房屋面积和房间数经常一起变大,模型可能难以稳定判断每个特征单独贡献了多少。这类问题叫多重共线性。
多重共线性不一定会让预测完全失败,但可能让参数解释变得不稳定:训练数据稍微变化,
特征缩放解决的是另一个问题:它不改变特征之间是否相关,而是让不同特征的数值范围更接近,从而让梯度下降更容易收敛。
| 问题 | 主要影响 | 常见处理 |
|---|---|---|
| 特征尺度差异大 | 梯度下降慢或震荡 | 均值归一化、标准化 |
| 特征高度相关 | 参数不稳定、解释困难 | 删除冗余特征、正则化 |
6.8 和神经网络的关系
多变量线性回归可以看成一个没有隐藏层、输出为连续值的模型:
神经网络中的全连接层也在做类似的线性变换,只是后面通常还会接非线性激活函数。没有激活函数时,多层线性变换叠在一起,本质上仍然可以合并成一个线性变换;加入激活函数后,模型才具备表达复杂非线性关系的能力。
这也是后面学习神经网络时要特别注意的点:权重和偏置负责线性变换,激活函数负责引入非线性。