矩阵的广义逆及python实践

机器学习的代码中经常有求矩阵的广义逆,本文先从概念上总结了矩阵的广义逆,然后用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 广义逆阵

[2]


机器学习的代码中经常有求矩阵的广义逆,本文先从概念上总结了矩阵的广义逆,然后用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 广义逆阵 [2]
经验分享 程序员 微信小程序 职场和发展