一文读懂特征值和特征向量


本文用一个实例来说明特征值和特征向量的起因和实际意义,然后给出定义,计算方法,python代码以及其他解释。

特征值分解

实例

某城市有10000名女性,其中8000名已婚,2000名未婚。每年有30%的已婚女性离婚,有20%的未婚女性结婚。计算若干年后该城市已婚女性和未婚女性的数量。

10000名女性可以用一个向量来表示,即 w 0 = [ 8000 , 2000 ] T w_0 = [8000,2000]^T w0=[8000,2000]T,每年的婚姻情况变化可以用矩阵来表示。
[ 0.7 0.2 0.3 0.8 ] \left[ \begin{matrix} 0.7 & 0.2 \\ 0.3 & 0.8 \\ \end{matrix} \right] [0.70.30.20.8]
这样,一年后已婚人数和未婚人数可以表示为
w 1 = A ∗ w 0 = [ 0.7 0.2 0.3 0.8 ] ∗ [ 8000 2000 ] = [ 6000 4000 ] w_1 = A * w_0 = \left[ \begin{matrix} 0.7 & 0.2 \\ 0.3 & 0.8 \\ \end{matrix} \right]* \left[ \begin{matrix} 8000 \\ 2000 \\ \end{matrix} \right] = \left[ \begin{matrix} 6000 \\ 4000 \\ \end{matrix} \right] w1=Aw0=[0.70.30.20.8][80002000]=[60004000]
一直这么变化下去,从第12年开始已婚未婚人数就稳定下来,到达一个稳态(steady state)。
w 12 = A 12 ∗ w 0 = [ 0.7 0.2 0.3 0.8 ] 12 ∗ [ 8000 2000 ] = [ 0.4 0.4 0.6 0.6 ] 12 ∗ [ 8000 2000 ] = [ 4000 6000 ] w_{12} = A^{12} * w_0 = \left[\begin{matrix} 0.7 & 0.2 \\ 0.3 & 0.8 \\ \end{matrix}\right]^{12} *\left[\begin{matrix} 8000 \\ 2000 \end{matrix}\right] = \left[\begin{matrix} 0.4 & 0.4 \\ 0.6 & 0.6 \\ \end{matrix}\right]^{12} *\left[\begin{matrix} 8000 \\ 2000 \end{matrix}\right]= \left[ \begin{matrix} 4000 \\ 6000 \\ \end{matrix} \right] w12=A12w0=[0.70.30.20.8]12[80002000]=[0.40.60.40.6]12[80002000]=[40006000]
这里会提出一个疑问,如果一开始已婚和未婚人数不是 w 0 = [ 8000 , 2000 ] T w_0 = [8000,2000]^T w0=[8000,2000]T,结果还会是 w 12 = [ 4000 , 6000 ] T w_{12} = [4000,6000]^T w12=[4000,6000]T吗?从上式可以看出,只要 A n A^{n} An收敛到等式中的值,不管初值是多少,结果总会是 [ 4000 , 6000 ] T [4000,6000]^T [4000,6000]T
根据这一点我们可以得到以下等式,设置向量 x 1 = [ 2 , 3 ] T x_1 = [2,3]^T x1=[2,3]T
A ∗ x 1 = A ∗ [ 2 3 ] = 1 ∗ [ 2 3 ] A * x_1 = A * \left[\begin{matrix}2\\3 \end{matrix}\right] = 1 *\left[\begin{matrix}2\\3 \end{matrix}\right] Ax1=A[23]=1[23]
接下来看另一个等式,设置向量 x 2 = [ − 1 , 1 ] T x_2 = [-1,1]^T x2=[1,1]T
A ∗ x 2 = A ∗ [ − 1 1 ] = 1 / 2 ∗ [ − 1 1 ] A * x_2 = A * \left[\begin{matrix}-1\\1 \end{matrix}\right] = 1/2 *\left[\begin{matrix}-1\\1 \end{matrix}\right] Ax2=A[11]=1/2[11]
假设初始状态,未婚女性人数为 p p p,已婚女性人数为 10000 − p 10000-p 10000p,即 w 0 = [ p , 10000 − p ] T w_0 = [p,10000-p]^T w0=[p,10000p]T使用向量 x 1 , x 2 x_1,x_2 x1,x2来表示,引入两个变量 c 1 , c 2 c_1,c_2 c1,c2,则有
w 0 = c 1 ∗ x 1 + c 2 ∗ x 2 w_0 = c_1* x_1 + c_2 * x_2 w0=c1x1+c2x2
w 1 = A ∗ w 0 = c 1 ∗ x 1 + ( 1 2 ) ∗ c 2 ∗ x 2 w_1 = A * w_0 = c_1* x_1 + (\frac{1}{2})* c_2 * x_2 w1=Aw0=c1x1+(21)c2x2
w n = A n ∗ w 0 = c 1 ∗ x 1 + ( 1 2 ) n ∗ c 2 ∗ x 2 w_n = A^n * w_0 = c_1* x_1 + (\frac{1}{2})^n* c_2 * x_2 wn=Anw0=c1x1+(21)nc2x2
展开 x 1 , x 2 x_1,x_2 x1,x2得到以下方程,可以解得 c 1 = 2000 c_1 = 2000 c1=2000
2 c 1 − c 2 = p 2c_1 - c_2 = p 2c1c2=p
3 c 1 + c 2 = 10000 − p 3c_1 + c_2 = 10000-p 3c1+c2=10000p
这样, w n w_n wn可以得到以下分解
w n = A n ∗ w 0 = 2000 ∗ [ 2 3 ] + ( 1 2 ) n ∗ ( 4000 − p ) ∗ [ − 1 1 ] w_n= A^n * w_0 = 2000*\left [\begin{matrix} 2 \\ 3 \\ \end{matrix}\right] + (\frac{1}{2})^n *(4000-p)* \left[\begin{matrix} -1 \\ 1 \\ \end{matrix}\right] wn=Anw0=2000[23]+(21)n(4000p)[11]
w n w_n wn由两部分组成,第一部分是稳态部分,变换 A A A对其不会造成影响。第二部分是瞬态部分,变换 A A A会对其造成衰减。这样,变换 A A A w 0 w_0 w0的作用就可以分解成两个部分,分别由特征向量 x 1 , x 2 x_1,x_2 x1,x2,和特征值 λ 1 , λ 2 \lambda_1,\lambda_2 λ1,λ2来表示。

定义

如果说一个向量 v v v是方阵 A A A的特征向量,将一定可以表示成下面的形式:
A v = λ v Av = \lambda v Av=λv
这时候 λ λ λ就被称为特征向量 v v v对应的特征值,矩阵的特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式:
A = Q Σ Q − 1 A = Q\Sigma Q^{-1} A=QΣQ1
其中 Q Q Q是这个矩阵 A A A的特征向量组成的矩阵, Σ \Sigma Σ是一个对角阵,每一个对角线上的元素就是一个特征值。求特征值和特征向量分别使用以下方程
d e t ( A − λ I ) = 0 (1) det(A -\lambda I) = 0\tag{1} det(AλI)=0(1) ( A − λ I ) ∗ x = 0 (2) (A- \lambda I) *x = 0\tag{2} (AλI)x=0(2)

计算

计算过程是先求解行列式 ( 1 ) (1) (1),得到特征值 λ \lambda λ,然后分别将特征值代入方程 ( 2 ) (2) (2)求得对应的特征向量 x x x
[ 0.7 − λ 0.2 0.3 0.8 − λ ] = 0 \left[\begin{matrix} 0.7-\lambda & 0.2 \\ 0.3 & 0.8-\lambda \\ \end{matrix}\right] = 0 [0.7λ0.30.20.8λ]=0

解方程得到 λ = [ 0.5 , 1 ] \lambda = [0.5,1] λ=[0.5,1]
λ = 0.5 \lambda = 0.5 λ=0.5时,有
[ 0.2 0.2 0.3 0.3 ] [ x 1 x 2 ] = 0 \left[\begin{matrix} 0.2 & 0.2 \\ 0.3 & 0.3 \\ \end{matrix}\right]\left[\begin{matrix} x1 \\ x2 \end{matrix}\right] = 0 [0.20.30.20.3][x1x2]=0
解得 x 1 = − x 2 x_1 = -x_2 x1=x2,即属于特征值 λ 1 = 0.5 \lambda_1=0.5 λ1=0.5有特征向量 [ 0.707 , − 0.707 ] T [0.707,-0.707]^T [0.707,0.707]T,这里做了归一化,要求 ∣ ∣ x ∣ ∣ = 1 ||x|| = 1 x=1。同理可以求得属于特征值 λ 2 = 1 \lambda_2 = 1 λ2=1的特征向量 [ − 0.5547 , − 0.832 ] T [-0.5547,-0.832]^T [0.5547,0.832]T

代码

python 代码和输出结果如下

import numpy as np
A = np.array([[0.7, 0.2],[0.3, 0.8]])
eigenvalues, eigenvectors = np.linalg.eig(A)
print('eigenvlues are', eigenvalues)
print('eigenvectors are \n',eigenvectors)
eigenvlues are [0.5 1. ]
eigenvectors are 
 [[-0.70710678 -0.5547002 ]
 [ 0.70710678 -0.83205029]]

其他解释

(以下部分来自其他人的博客)
首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵:
M = [ 3 0 0 1 ] M = \left [\begin{matrix} 3 & 0 \\ 0 & 1 \\ \end{matrix}\right] M=[3001]
它其实对应的线性变换是下面的形式:
这里写图片描述
因为这个矩阵 M M M乘以一个向量 [ x , y ] T [x,y]^T [x,y]T的结果是:
[ 3 0 0 1 ] ∗ [ x y ] = [ 3 x y ] \left [\begin{matrix} 3 & 0\\ 0 & 1 \\ \end{matrix}\right] * \left[\begin{matrix} x\\ y\\ \end{matrix}\right] = \left[\begin{matrix} 3x\\y\end{matrix}\right] [3001][xy]=[3xy]
上面的矩阵是对称的,所以这个变换是一个对 x , y x,y xy轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值 > 1 >1 >1时拉长,当值 < 1 <1 <1时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子:
M = [ 1 1 0 1 ] M =\left [\begin{matrix} 1 & 1 \\ 0 & 1 \\ \end{matrix}\right] M=[1011]
它所描述的变换是下面的样子:
这里写图片描述

这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)

当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值