原文在此,仅仅将原文的Matlab代码改为Python3版本。
特征值与特征向量的几何意义
矩阵的乘法是什么,别只告诉我只是“前一个矩阵的行乘以后一个矩阵的列”,还会一点的可能还会说“前一个矩阵的列数等于后一个矩阵的行数才能相乘”,然而,这里却会和你说——那都是表象。
矩阵乘法真正的含义是变换,我们学《线性代数》一开始就学行变换列变换,那才是线代的核心——别会了点猫腻就忘了本——对,矩阵乘法:
就是线性变换,若以其中一个向量A为中心,则B的作用主要是使A发生如下变化:
1. 伸缩
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
#设置中文字体
myfont = FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
以上几行为下面三段代码相同的铺垫部分,后面不再重复
A = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]]) #原空间
B = np.array([[3,0],[0,2]]) #线性变换矩阵
Y = np.dot(B,A)
plt.clf()
plt.plot(A[0],A[1],'-*',lw=2)
plt.text(0.6,1.03,u'变换前',fontsize =14,fontproperties=myfont)
plt.plot(Y[0],Y[1],'-r*',lw=2)
#font size: xx-small;x-small;small;medium;large;x-large;xx-large
plt.text(0.6,2.03,u'变换后',fontsize ='large',fontproperties=myfont)
plt.axis([0,3,0,3]);plt.grid(True)
plt.show()
从上图可知,y方向进行了2倍的拉伸,x方向进行了3倍的拉伸,这就是B=[3 0; 0 2]的功劳,3和2就是伸缩比例。请注意,这时B除了对角线元素为各个维度的倍数外,非正对角线元素都为0,因为下面将要看到,对角线元素非0则将会发生切变及旋转的效果。
2. 切变
A = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]]) #原空间
plt.clf()
B1=np.array([[1,0],[1,1]])
B2=np.array([[1,0],[-1,1]])
B3=np.array([[1,1],[0,1]])
B4=np.array([[1,-1],[0,1]])
Y1 = np.dot(B1,A)
Y2 = np.dot(B2,A)
Y3 = np.dot(B3,A)
Y4 = np.dot(B4,A)
plt.subplot(221)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y1[0],Y1[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.subplot(222)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y2[0],Y2[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.subplot(223)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y3[0],Y3[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.subplot(224)
plt.plot(A[0],A[1],'-*',lw=2)
plt.plot(Y4[0],Y4[1],'-r*',lw=2)
plt.axis([-1,3,-1,3]);plt.grid(True)
plt.show()
3. 旋转
所有的变换其实都可以通过上面的伸缩和切变变换的到,如果合理地对变换矩阵B取值,能得到图形旋转的效果,如下:
A = np.array([[0, 1, 1, 0, 0],[1, 1, 0, 0, 1]]) #原空间
plt.clf()
the