特征值与奇异值

文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。

在统计学习方法中,我们会经常使用到特征值和奇异值,本文对其背后的特定意义做一个梳理。

0 我能想到的适用或有益理解的场景

  • OLS 最小二乘法
  • PCA分析
    • 数据压缩
  • Fisher information matrix
    • 矩阵条件数

1 特征值与特征向量

Wikipedia: In linear algebra, an eigenvector or characteristic vector of a linear transformation is a non-zero vector that changes by only a scalar factor when that linear transformation is applied to it.

1.1 定义

首先,看这个定义,

$$A v=\lambda v$$

其中$\lambda$是特征值(eigenvalue),$v$为特征向量。

其实这个公式就可以说明很多特点:

  • $A$为(作用)方阵
  • $v$是$A$的特征向量;
  • $\lambda$是$A$的特征值,为纯量,表示为对角阵

让我们根据这个式子展开想象:

矩阵的乘法都是线性变换,式子想说明,特征向量在$A$的作用下进行线性变换,效果是特征向量的$\lambda$倍伸缩。注意:

  • 并不是所有向量都能被$A$给伸缩,只有$v$中的向量(特征向量)能被其伸缩;
  • 伸缩的尺度$\lambda$体现$A$的变换能力。

援引维基百科就是“在数学上,特别是线性代数中,对于一个给定的方阵$A$,它的特征向量(eigenvector,也译固有向量或本征向量)$v$经过这个线性变换之后,得到的新向量仍然与原来的$v$保持在同一条直线上,但其长度或方向也许会改变”。这个方向是正负那个方向,不是小旋转。

这样的话,如果我们知道了一个方阵的特征值和特征向量,就知道了这个方阵的线性变换能力

放到应用场景中就是,我们通过特征值就能掌握当前数据在对应方向上的变换能力。所以某些场景中,我们选取较大的特征值们来代表原数据的变换能力,例如:PCA分析、数据压缩。

1.2 计算

那么,怎么得到特征值和特征向量呢?

  • Matlab:scipy.linalg.eig()提供类似下面Matlab函数的计算。

    1
    2
    3
    4
    5
    6
    7
    %matlab

    [V,D] = eig(A)

    % returns diagonal matrix D of eigenvalues and matrix V
    % whose columns are the corresponding right eigenvectors,
    % so that A*V = V*D.
  • 手算特征值: 除了考试,请使用计算机,写出来仅供娱乐。

$$\begin{aligned}(\mathbf{A}-\lambda \mathbf{I}) \mathbf{x} &=0 \ det(\mathbf{A}-\lambda \mathbf{I}) &=0 \end{aligned}$$

2 奇异值和奇异值分解

奇异值与上文中的特征值相对应。特征值固然方便使用,但其对原矩阵为方阵的限制为实际情况下所难得的。自然,我们就需要一种更一般化的特征提取方式,这里的特征我们叫奇异值(singular value),而这种方式正是奇异值分解(singular-value decomposition (SVD))。所以,该分解和结果的意义与特征值类似,但拓展了适用范围。

2.1 定义

$$M=U \Sigma V^{*}$$

  • $M$: $m\times n$矩阵;
  • $U$: $m\times m$ 酉矩阵(unitary matrix);
  • $\Sigma$: $m\times n$ 的对角阵,对角元素非负(奇异值);
  • $V^{*}$: $n\times n$ 酉矩阵,是$V$的转置。

需要注意的是,奇异值分解结果并不唯一。

2.2 与特征值分解的关系

除开适用范围,我们可以将特征值分解看成SVD的一个特例。而更深层的联系是在于[引自维基百科],对于$M=U \Sigma V^{*}$:

  • $U$的列是$M$正交输出基向量,是$MM^T$的特征向量;
  • $\Sigma$是$M^TM,MM^T$的特征值的非负平方根;
  • $V$的列是$M$正交输入基向量,是$M^T M$的特征向量。

随手验证感受一下:

1
2
3
4
5
6
import numpy as np
from scipy import linalg

M = np.array([[1,0,3,1], [1,2,3,2], [1,2,3,4]])
U,S,V = linalg.svd(M)
print('U=',U,'\n\nS=',s,'\n\nV=',V.T)
U= [[-0.38925572  0.85502491  0.34265491]
 [-0.56511886  0.07208746 -0.82185404]
 [-0.7274068  -0.51355215  0.45513025]] 

S= [4.71147949 1.3423714 ] 

V= [[-2.27634931e-01  2.17876780e-01 -2.66842116e-02 -9.48683298e-01]
 [-3.49895643e-01 -4.65155494e-01 -8.13144148e-01 -2.37643771e-16]
 [-6.82904792e-01  6.53630339e-01 -8.00526349e-02  3.16227766e-01]
 [-5.99496807e-01 -5.55812428e-01  5.75913294e-01 -1.66533454e-16]]
1
linalg.eig(M.dot(M.T))
(array([54.58348639+0.j,  3.60292832+0.j,  0.81358529+0.j]),
 array([[-0.38925572, -0.85502491,  0.34265491],
        [-0.56511886, -0.07208746, -0.82185404],
        [-0.7274068 ,  0.51355215,  0.45513025]]))
1
S ** 2
array([54.58348639,  3.60292832,  0.81358529])
1
linalg.eig(M.T.dot(M))
(array([5.45834864e+01+0.j, 3.60292832e+00+0.j, 7.98251465e-16+0.j,
        8.13585293e-01+0.j]),
 array([[ 2.27634931e-01,  2.17876780e-01,  9.48683298e-01,
         -2.66842116e-02],
        [ 3.49895643e-01, -4.65155494e-01,  2.02012103e-17,
         -8.13144148e-01],
        [ 6.82904792e-01,  6.53630339e-01, -3.16227766e-01,
         -8.00526349e-02],
        [ 5.99496807e-01, -5.55812428e-01,  1.84126527e-17,
          5.75913294e-01]]))

我们从中需要知道的是,这些结果是和$M^TM$或$MM^T$有关系的。

这些性质我在Fisher information matrix中用到了一点点。

2.3 计算

  • Matlab

    1
    [U,S,V] = svd(A)
  • Python

    1
    U,s,Vh = scipy.linalg.svd(A)

都看到这儿了,不如关注每日推送的“科文路”、互动起来~

Author

xlindo

Posted on

2022-02-23

Updated on

2023-05-10

Licensed under

Comments