💬 例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/
本篇完。