机器学习的代码中经常有求矩阵的广义逆,本文先从概念上总结了矩阵的广义逆,然后用python的numpy库实践。
概念
矩阵的广义逆(Generalized inverse)也称为伪逆(pseudo inverse),假设一个矩阵 及另一矩阵
,若
满足
,则
即为A的广义逆矩阵。
提出矩阵的广义逆的原因
提出矩阵的广义逆的目的是对于可逆矩阵以外的矩阵(例如非方阵的矩阵)可以找到一矩阵有一些类似逆矩阵的特性。任意的矩阵都存在广义逆,若一矩阵存在逆矩阵,逆矩阵即为其唯一的广义逆阵。
考虑以下的线性方程组:
, 其中 A为
的矩阵,而y属于A的列空间。
若矩阵A是可逆矩阵,则 即为方程式的解。而若矩阵A是可逆矩阵
若矩阵A不可逆或是 ,需要一个
矩阵
使得下式成立:
因此 是线性方程组
的解,此
阶的矩阵
也使
成立。
因此可以用以下的方式定义广义逆矩阵:若一个的矩阵A,
的矩阵
若可以使
成立,则矩阵
是A的广义逆矩阵。
矩阵的广义逆的种类
若及
(1)
(2)
(3)
(4) .
若 满足(1),即A的广义逆阵。
若满足(1)和(2),则为A的generalized reflexive inverse。
若四个条件都满足,则为A的Moore–Penrose pseudoinverse。
python实践
下面用numpy.linalg.pinv实践求矩阵的广义逆。
# 定义一个矩阵
In [26]: A=np.array([[1, 2], [3, 4],[5,6]])
In [27]: A
Out[27]:
array([[1, 2],
[3, 4],
[5, 6]])
# 求矩阵的伪逆
In [28]: pinv = np.linalg.pinv(A)
In [29]: pinv
Out[29]:
array([[-1.33333333, -0.33333333, 0.66666667],
[ 1.08333333, 0.33333333, -0.41666667]])
复制代码
测试一下
# 中间变量
In [31]: mid = np.dot(A, pinv)
# 满足伪逆的定义,得回了原矩阵A
In [33]: np.dot(mid,A)
Out[33]:
array([[1., 2.],
[3., 4.],
[5., 6.]])
复制代码
因此可以看出,numpy.linalg.pinv的结果(上面的pinv矩阵)满足
参考资料:
[1] wikipedia 广义逆阵