一、矩阵乘法
Ci,j=A[i]TB[:,j]
A
的第
所以考虑如下的标量形式:
∑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
是一个
>>> 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()
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]
行和在重复;