0
点赞
收藏
分享

微信扫一扫

【线代&NumPy】第十三章 - 矩阵对角化课后练习 | 特征值分解 | 散布矩阵 | 降维方法LDA | 简述并提供代码


💬 例1:

import numpy as np

# 打印A的函数
def pprint(msg, A):
print("---", msg, "---")
(n,m) = A.shape
for i in range(0, n):
line = ""
for j in range(0, m):
line += "{0:.2f}".format(A[i,j]) + "\t"
print(line)
print("")

print("特征值分解\n")
A = np.array([[3.0, 1.0], [2.0, 2.0]])
w, S = np.linalg.eig(A)
L = np.diag(w)
pprint("矩阵B ", A)
pprint("特征矩阵 L", L)
pprint("特征向量矩阵 S", S)
pprint("S*L*S^{-1}", np.matmul(np.matmul(S,L), np.linalg.inv(S)))

B = np.array([[1.0, 1.0, 0.0], [1.0, 3.0, 1.0], [2.0, -1.0, 1.0]])
w, S = np.linalg.eig(B)
L = np.diag(w)
pprint("矩阵B", B)
pprint("特征矩阵 L", L)
pprint("特征向量矩阵 S", S)
pprint("S*L*S^{-1}", np.matmul(np.matmul(S,L), np.linalg.inv(S)))

🚩 运行结果:

特征值分解

--- 矩阵B  ---  
3.00    1.00    
2.00    2.00

--- 特征矩阵 L ---
4.00    0.00
0.00    1.00

--- 特征向量矩阵 S ---
0.71    -0.45
0.71    0.89

--- S*L*S^{-1} ---
3.00    1.00
2.00    2.00

--- 矩阵B ---
1.00    1.00    0.00
1.00    3.00    1.00
2.00    -1.00   1.00

--- 特征矩阵 L ---
3.36+0.00j      0.00+0.00j      0.00+0.00j
0.00+0.00j      0.82+0.90j      0.00+0.00j
0.00+0.00j      0.00+0.00j      0.82-0.90j

--- 特征向量矩阵 S ---
0.39+0.00j      -0.19+0.29j     -0.19-0.29j
0.92+0.00j      -0.22-0.22j     -0.22+0.22j
-0.06+0.00j     0.88+0.00j      0.88-0.00j      

--- S*L*S^{-1} ---
1.00-0.00j      1.00+0.00j      -0.00-0.00j
1.00+0.00j      3.00-0.00j      1.00-0.00j
2.00+0.00j      -1.00-0.00j     1.00-0.00j
 

💬 例2:

import numpy as np
from numpy.matlib import repmat
import matplotlib.pyplot as plt
from scipy import linalg

C1 = np.array([[2.,3.], [2.,4.], [3.,6.], [4.,1.], [4.,4.]])
C2 = np.array([[6.,8.], [8.,7.], [9.,5.], [9.,10.], [10.,8.]])

mu1 = np.mean(C1, axis=0) # 计算C1数据的平均向量
mu2 = np.mean(C2, axis=0) # 计算C2数据的平均向量

print("C1的平均矩阵 =", mu1)
print("C2的平均矩阵 =", mu2)

S1 = np.cov(C1.T)*(C1.shape[0]-1)
S2 = np.cov(C2.T)*(C2.shape[0]-1)
Sw = S1 + S2 # C1、 C2 散布矩阵之和
print("C1类内的散布矩阵 = ", S1)
print("C2类内的散布矩阵 = ", S2)
print("和 = ", Sw)

Sb = (mu1 - mu2).reshape(2,1).dot((mu1 - mu2).reshape(1,2))
print("类间散布矩阵 = ", Sb)

D, U = linalg.eig(linalg.inv(Sw).dot(Sb)) # 计算Sw-1Sb的特征值
print("Sw^{-1}*Sb 的特征值 = ", D)
wLDA = U[:,0]
print("降维方法LDA 正射影 = ", wLDA)

plt.figure(1)
plt.plot(C1[:,0], C1[:,1], 'bd')
plt.plot(C2[:,0], C2[:,1], 'ko')
plt.plot([0, wLDA[0]*15], [0,wLDA[1]*15], 'r')
plt.show()

🚩 运行结果:

C1的平均矩阵 = [3. 3.6]

C2的平均矩阵 = [8.4 7.6]

C1类内的散布矩阵 = [[ 4. -2. ]

[-2. 13.2]]

C2类内的散布矩阵 = [[ 9.2 -0.2]

[-0.2 13.2]]

和 = [[13.2 -2.2]

[-2.2 26.4]]

 类间散布矩阵 = [[29.16 21.6 ]

[21.6 16. ]]

Sw^{-1}*Sb 的特征值 = [3.13137004+0.j 0. +0.j]

降维方法LDA 正射影 = [0.91955932 0.39295122]

参考文献

Introduction to Linear Algebra, International 4 th Edition by Gilbert Strang, Wellesley Cambridge Press.

百度百科[EB/OL]. []. https://baike.baidu.com/

本篇完。

举报

相关推荐

0 条评论