特征值与奇异值
文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。
在统计学习方法中,我们会经常使用到特征值和奇异值,本文对其背后的特定意义做一个梳理。
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 | import numpy as np |
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)
都看到这儿了,不如关注每日推送的“科文路”、互动起来~