分享

矩阵等式 matrix identity(numpy仿真)

 imelee 2017-05-17

一、矩阵乘法

Ci,j=A[i]TB[:,j]

A 的第 i 行,B 的第 j 列的内积。

所以考虑如下的标量形式:

ijαiαjzTizj

自然可以化为:
ijαiαjKij=αTKα

A = np.random.randint(0, 5, (3, 4))
B = np.random.randint(0, 5, (4, 3))
C = A.dot(B)
i, j = 2, 1
print(A[i].dot((B[:, j])) == C[i][j])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

二、矩阵的迹

ixTiAxi=tr(AixixTi)=tr(AXXT)

import numpy as np

def main():
    X = np.random.randn(10, 3)
    A = np.random.randn(3, 3)
    sum1 = 0
    for i in range(X.shape[0]):
        sum1 += np.dot(X[i, :], np.dot(A, X[i, :].T))
    sum2 = np.trace(np.dot(A, np.dot(X.T, X)))
    print(sum1)
                        # 10.158513956
    print(sum2)
                        # 10.158513956
if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三、特征值分解

A 是一个 N×N的方阵, 且有 N个线性无关的特征向量 qi(i=1,2,,N)。这样 A可被分解为:

A=QΛQ?1?AQ=QΛ

>>> import numpy as np
>>> A = np.random.randn(3, 3)

>>> Lambda, Q = np.linalg.eig(A)
                    # 其中Lambda是一维向量,由特征值构成

>>> np.dot(Q, np.dot(np.diag(Lambda), np.linalg.inv(Q)))
array([[-0.15446862, -1.57279859, -0.28165496],
       [-0.99437763, -0.54065794,  0.75029032],
       [-0.49977911,  1.78752911, -1.17139559]])
>>> A
array([[-0.15446862, -1.57279859, -0.28165496],
       [-0.99437763, -0.54065794,  0.75029032],
       [-0.49977911,  1.78752911, -1.17139559]])

>>> [np.linalg.norm(Q[:, i], 2) for i in range(Q.shape[1])]
                        # 每一个特征向量的二范数,
[0.99999999999999989, 1.0, 1.0]
                        # 可见,numpy提供的特征分解已为我们做了特征向量的归一化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

实对称矩阵不同的特征值对应的特征向量彼此正交(证明见 矩阵理论拾遗)。为了使用numpy线性代数工具箱进行测试,我们首先构造一个对称矩阵:

>>> import numpy as np
>>> A = np.random.randn(3, 3)
>>> A = np.triu(A)
>>> A += (A.T-np.diag(A.diagonal()))

>>> Lambda, Q = np.linalg.eig(A)
>>> np.dot(Q.T, Q)
[[  1.00000000e+00  -3.88578059e-16   1.11022302e-16]
 [ -3.88578059e-16   1.00000000e+00   1.11022302e-16]
 [  1.11022302e-16   1.11022302e-16   1.00000000e+00]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

实对称矩阵又可被分解为:

A=QΛQT

也即 QT=Q?1?QQT=IQ正交矩阵(orthogonal matrix)

import numpy as np

def main():
    X = np.random.randn(10, 3)  
    N = X.shape[0]
    C = np.dot(X.T, X)/N
    Lambda, Q = np.linalg.eig(C)

    print(np.dot(Q, Q.T))
    print(np.dot(Q.T, Q))

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

QTQ=I,正交矩阵的行列式比为1或-1,

1=det(I)=det(QTQ)=det(QT)det(Q)=(detQ)2?det(Q)=±1

四、矩阵分块

C=1NxixTi=1NXXT

import numpy as np

def main():
    X = np.random.randn(10, 3)  
    C = 0
    N = X.shape[0]
    for i in range(N):
        C += np.dot(X[i][:, np.newaxis], X[i][np.nexaxis, :])
    C /= N
    C2 = np.dot(X.T, X)/N
    print(C==C2)

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

C=UΛUT=αλαuαuTα

五、二次型

二次型的结果是一个标量;

xTAx=i,jxixjAij

import numpy as np

def main():
    x = np.array([1, 2, 3]) 
    A = np.random.randn(3, 3)

    print(np.dot(x, np.dot(A, x)))

    s = 0
    for i in range(A.shape[0]):
        for j in range(A.shape[1]):
            s += A[i, j]*x[i]*x[j]  
    print(s)

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

六、全1矩阵左乘一个矩阵 右乘一个矩阵

[1,1,11]?[a11,a21,a12a22]=[11][1,1]?[a11,a21,a12a22]

列和在重复;

[a11,a21,a12a22]?[1,1,11]=[a11,a21,a12a22]?[11]?[1,1]

行和在重复;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多