矩阵等式 matrix identity(numpy仿真)

一、矩阵乘法

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])

二、矩阵的迹

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()

三、特征值分解

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

A=QΛQ1AQ=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提供的特征分解已为我们做了特征向量的归一化

实对称矩阵不同的特征值对应的特征向量彼此正交(证明见 矩阵理论拾遗)。为了使用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]]

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

A=QΛQT

也即 QT=Q1QQT=I Q 正交矩阵(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()

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

1=det(I)=det(QTQ)=det(QT)det(Q)=(detQ)2det(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()

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矩阵左乘一个矩阵 右乘一个矩阵

[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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值