线性回归中为何优先使用numpy.linalg.pinv()而非inv()求矩阵逆?
numpy.linalg.pinv()而非numpy.linalg.inv()? 这问题问得太到位了!咱们在线性回归里选伪逆(pinv)而非普通逆(inv),核心是因为伪逆完美解决了普通逆搞不定的场景,还自带更强的数值稳定性,完全适配实际建模的需求。具体来说:
能处理奇异矩阵/非方阵情况
在线性回归中,当特征之间存在多重共线性(比如两个特征高度相关),或者样本数量少于特征数量时,X^T X会变成奇异矩阵——这时候np.linalg.inv()直接就报错了,因为奇异矩阵不存在逆矩阵。但np.linalg.pinv()计算的是Moore-Penrose伪逆,不管矩阵是否可逆、是不是方阵,都能给出一个合理的“逆”结果,帮你算出theta参数。这在现实任务里太实用了,毕竟我们很少能拿到完美无冗余的数据集。数值稳定性更强
就算X^T X理论上可逆,实际计算时也可能因为浮点数精度问题,变成接近奇异的矩阵(比如某个特征值极小)。这时候用inv()算出来的结果误差会极大,甚至完全不可靠。而pinv()是通过奇异值分解(SVD)实现的,它会自动忽略那些极小的奇异值,避免了数值不稳定带来的问题,得到的theta估计会更稳健。通用型更强,不用额外判断
其实当X^T X可逆时,伪逆和普通逆的结果是完全一致的。也就是说,用pinv()不管数据情况如何都能正常工作,你不用提前去判断X^T X是否可逆,减少了代码出错的可能性——与其写一堆判断逻辑,不如直接用更通用的方案。
拿你给出的示例来说,当前的X^T X是可逆的,所以用inv()和pinv()得到的theta结果差异很小,但如果你的数据集出现特征冗余或者样本不足的情况,inv()直接就罢工了,而pinv()还能继续输出可用的参数估计。
内容的提问来源于stack exchange,提问作者2Obe

