多元线性回归的梯度下降实现不收敛,仅前期迭代有小幅变动
问题定位及修复方案
1. 未做特征归一化/标准化
多元线性回归执行梯度下降的前提是各特征量级接近,若不同特征取值范围相差几个数量级,会导致梯度更新方向偏移、收敛速度极慢,表现为参数更新幅度极小、成本长时间停滞不动。
- 修复方法:对输入的X矩阵做标准化处理,公式为
X = (X - X.mean(axis=0)) / X.std(axis=0),注意偏置项对应的全1列不要做归一化。
2. 学习率alpha设置不合理
如果alpha取值过小,每次参数更新的幅度会非常小,需要极多轮迭代才能看到明显的参数变化;如果alpha取值过大,则可能出现成本震荡甚至上升的情况。
- 修复方法:先尝试把alpha放大10~100倍测试,观察成本是否持续下降,如果出现成本上升就调小alpha,直到成本能稳定持续下降即可。
3. 未给X添加偏置项
如果未给特征矩阵X添加全1的偏置列,模型只能拟合过原点的直线,拟合能力受限,成本下降到一定程度就会停滞,参数也不会再明显更新。
- 修复方法:在输入梯度下降前给X添加一列全1,代码示例:
X = np.hstack([np.ones((X.shape[0], 1)), X])
4. 初始化theta的数据类型异常
如果初始化theta时用了整数类型(int),每次更新的幅度如果小于1,会被整数类型截断,表现为参数更新1~2次后就完全不动。
- 修复方法:初始化theta时指定为浮点类型,比如
theta = np.zeros(d, dtype=np.float64)
5. 代码缩进错误
你贴出的computeCost方法中,参数说明后的代码没有正确缩进,会导致这部分代码不属于该方法,计算成本时返回值异常,影响对收敛状态的判断。
- 修复方法:把
computeCost方法下的逻辑代码统一缩进一层,和方法内的注释对齐。
内容的提问来源于stack exchange,提问作者amir1122
相关产品推荐
相关产品推荐

