您的位置:首页 > 编程语言 > Python开发

矩阵等式 matrix identity(numpy仿真)

2016-01-08 17:44 591 查看

一、矩阵乘法

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

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

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

∑i∑jαiαjzTizj

自然可以化为:

∑i∑jα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(A∑ixixTi)=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Λ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提供的特征分解已为我们做了特征向量的归一化


实对称矩阵不同的特征值对应的特征向量彼此正交(证明见 矩阵理论拾遗)。为了使用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=Q−1⇒QQT=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)2⇓det(Q)=±1

四、矩阵分块

C=1N∑xixTi=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]

行和在重复;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: