全元素为正的矩阵调用np.linalg.pinv求伪逆出现负值的原因
全正元素矩阵求伪逆出现负值的原因
首先可以明确:矩阵所有元素为正,不代表它的逆(包括摩尔-彭罗斯伪逆)的元素也必须为正,这是线性代数的固有性质,不存在调用错误、计算异常的问题。
具体可以拆解为几点说明:
- 你使用的
np.linalg.pinv计算的是摩尔-彭罗斯伪逆,适配你给出的秩亏矩阵场景:你示例中的矩阵np.array([[1,2,3],[4,5,6],[7,8,9]])秩仅为2,不存在普通逆矩阵,伪逆的计算基于SVD分解,会对奇异值取倒数后与左右奇异矩阵做乘积,运算过程中符号由奇异向量的符号决定,出现负值是正常的计算结果。 - 即便是满秩的全正元素矩阵,求逆后也大概率会出现负值,比如以下2阶满秩矩阵的计算示例:
输出结果为:import numpy as np a = np.array([[2,3],[2,4]]) print(np.linalg.inv(a))
同样存在负值。求逆的本质是求矩阵B满足[[ 2. -1.5] [-1. 1. ]]A @ B = I(I为单位矩阵),单位矩阵中存在大量0元素,要让A的正元素与B的对应行列元素加权求和得到0,必然需要正负值抵消,所以绝大多数正元素矩阵的逆都会出现负值。 - 只有极少数特殊结构的非负矩阵(比如对角元全正的对角矩阵、满足严格约束的M矩阵等)的逆才能保持所有元素非负,这类矩阵属于特殊范畴,不适用于通用场景。
内容的提问来源于stack exchange,提问作者Timmy Diehl
相关产品推荐
相关产品推荐

