数据科学、数据分析、人工智能必备知识汇总-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/140174015 |
---|
1. 二次型
学二次型,很大原因是为了求Hessian矩阵
二次型就是纯二次项构成的一个函数。因为二次函数(方程)的二次部分最重要,为了方便研究,我们把含有n个变量的二次齐次函数: f ( x 1 , x 2 , ⋯ , x n ) = a 11 x 1 2 + a 22 x 2 2 + ⋯ + a n n x n 2 + 2 a 12 x 1 x 2 + 2 a 13 x 1 x 3 + ⋯ + 2 a n − 1 , n x n − 1 x n f(x_1,x_2,\cdots,x_n) = a_{11}x_1^2+a_{22}x_2^2+\cdots+a_{nn}x_n^2+2a_{12}x_1x_2+2a_{13}x_1x_3+\cdots+2a_{n-1,n}x_{n-1}x_n f(x1,x2,⋯,xn)=a11x12+a22x22+⋯+annxn2+2a12x1x2+2a13x1x3+⋯+2an−1,nxn−1xn称为二次型
二次型就是一个数,就是一个向量 x x x和一个矩阵 A A A相乘的结果。就是上面这个式子,也是一种表现形式
二次型的矩阵表示及其秩
f ( x ) = x T A x f(x) = x^TAx f(x)=xTAx,其中 A = A T A=A^T A=AT. A A A的秩称为二次型 f f f的秩。但要注意,若A不是实对称,需要化为实对称后,才能用这个求秩
[ x 1 ⋯ ⋯ x n ] \begin{bmatrix}x_1 & \cdots &\cdots &x_n\end{bmatrix} [x1⋯⋯xn] [ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ] \begin{bmatrix} a_{11} & a_{12} & \cdots &a_{1n}\\\\ a_{21} & a_{22} & \cdots &a_{2n}\\\\ \cdots & \cdots & \cdots &\cdots\\\\ a_{n1} & a_{n2} & \cdots &a_{nn} \end{bmatrix} a11a21⋯an1a12a22⋯an2⋯⋯⋯⋯a1na2n⋯ann [ x 1 ⋮ ⋮ x n ] \begin{bmatrix}x_1 \\ \vdots \\ \vdots \\ x_n\end{bmatrix} x1⋮⋮xn
举个例子
这是对方阵而言的, a i j a_{ij} aij 有 n n n的平方这么多项,这种形式在机器学习中会见到
比如是一次型的: f ( x ; w ) = w T x + b f(x;w) = w^Tx+b f(x;w)=wTx+b
或者二次型的: f ( x ; w ) = x T w x + b f(x;w) = x^T w x + b f(x;w)=xTwx+b
例如我们遇到的场景的数据分布是一次型的,那我们就可以选择 logistic regression逻辑回归、SVM支持向量机等分界面为一次型的模型
如果场景的数据分布是二次型的,我们可以选择 naive bayes分类模型,朴素贝叶斯法
如果场景的数据分布既不是一次型也不是二次型,那我们可以选择基于决策树的模型,例如 gbdt梯度提升决策树,random forest随机森林等,或者 DNN深度神经网络,这些模型都高度非线性,表达能力极强,理论上可以拟合任意曲线
此时回看 Hessian 矩阵: 对于二次型函数 f ( x ) = x T A x 对于二次型函数f(x) = x^T A x 对于二次型函数f(x)=xTAx
f ( x ) > 0 , x ≠ 0 , x 属于 R , 则 f 为 f(x)>0,x≠0,x属于\R,则f为 f(x)>0,x=0,x属于R,则f为 正定二次型 , 正定二次型, 正定二次型, A 为正定矩阵 A为正定矩阵 A为正定矩阵
f ( x ) ≥ 0 , x ≠ 0 , x 属于 R , 则 f 为 f(x)≥0,x≠0,x属于\R,则f为 f(x)≥0,x=0,x属于R,则f为 半正定二次型 , 半正定二次型, 半正定二次型, A 为半正定矩阵 A为半正定矩阵 A为半正定矩阵
f ( x ) < 0 , x ≠ 0 , x 属于 R , 则 f 为 f(x)<0,x≠0,x属于\R,则f为 f(x)<0,x=0,x属于R,则f为 负定二次型 , 负定二次型, 负定二次型, A 为负定矩阵 A为负定矩阵 A为负定矩阵
f ( x ) ≤ 0 , x ≠ 0 , x 属于 R , 则 f 为 f(x)≤0,x≠0,x属于\R,则f为 f(x)≤0,x=0,x属于R,则f为 半负定二次型 , 半负定二次型, 半负定二次型, A 为半负定矩阵 A为半负定矩阵 A为半负定矩阵
以上条件皆不满足,则A为不定
正定
半正定
不定
2. 特征值与特征向量
在机器学习中会被用到,像 PCA 主成分分析,LDA 线性判别分析,以及其它算法里面都会用到它的理论和方法
设A是n阶矩阵, λ \lambda λ是一个数,若存在n维非零向量 ξ \xi ξ,使得 A ξ = λ ξ ,且 ξ ≠ 0 A\xi = \lambda \xi,且\xi ≠0 Aξ=λξ,且ξ=0,则称 λ \lambda λ是 A A A的特征值, ξ \xi ξ是 A A A的对应与特征值 λ \lambda λ的特征向量
我们已经知道,矩阵和向量的乘法就相当于对该向量做了一个线性变换。在这个变换中,大部分的向量都发生了偏移,脱离了原“轨道”
而 A ξ = λ ξ A\xi = \lambda \xi Aξ=λξ,表示 矩阵 A 矩阵A 矩阵A对 ξ \xi ξ做的线性变换,等价于 一个值 λ 一个值\lambda 一个值λ对 ξ \xi ξ做的线性变换。我们就称 λ \lambda λ是 A A A的特征值,而 ξ \xi ξ是 A A A对应与 特征值 λ 特征值\lambda 特征值λ的特征向量
又因为 A ξ = λ ξ A\xi = \lambda \xi Aξ=λξ可以化简为 0 = λ ξ − A ξ = ( λ E − A ) ξ = 0 0 = \lambda\xi - A\xi = (\lambda E - A)\xi = 0 0=λξ−Aξ=(λE−A)ξ=0。又因为 ξ ≠ 0 \xi ≠ 0 ξ=0,故 ∣ λ E − A ∣ = 0 |\lambda E - A|=0 ∣λE−A∣=0
特征值并不唯一,可以有多个
( λ E − A ) ξ = 0 (\lambda E - A)\xi = 0 (λE−A)ξ=0,这是n个未知数,n个方程的齐次线性方程组,它有非零解的充分必要条件是系数行列式 ∣ λ E − A ∣ = 0 |\lambda E - A|=0 ∣λE−A∣=0
λ 0 是 A 的特征值 ⇔ \lambda_0是A的特征值 \Leftrightarrow λ0是A的特征值⇔ ∣ λ E − A ∣ = 0 |\lambda E - A|=0 ∣λE−A∣=0
λ 0 不是 A 的特征值 ⇔ \lambda_0不是A的特征值 \Leftrightarrow λ0不是A的特征值⇔ ∣ λ E − A ∣ ≠ 0 |\lambda E - A|≠0 ∣λE−A∣=0
若 λ 1 , λ 2 , ⋯ , λ n \lambda_1,\lambda_2,\cdots,\lambda_n λ1,λ2,⋯,λn是A的n个特征值,则 { ∣ A ∣ = λ 1 λ 2 ⋯ λ n t r ( A ) = λ 1 + λ 2 + ⋯ + λ n \begin{cases}|A| =\lambda_1\lambda_2\cdots\lambda_n\\\\tr(A) = \lambda_1+\lambda_2+\cdots+\lambda_n\end{cases} ⎩ ⎨ ⎧∣A∣=λ1λ2⋯λntr(A)=λ1+λ2+⋯+λn
A x = λ x Ax=\lambda x Ax=λx,其中 A A A 是一个 n × n n×n n×n 的矩阵, x x x是一个n维向量,则我们说 λ \lambda λ是矩阵 A A A的一个特征值,而 x x x是矩阵 A A A 的特征值 λ \lambda λ所对应的特征向量。
求出特征值和特征向量有什么好处呢? 就是我们可以将矩阵 A A A 特征分解。如果我们求出了矩阵 A A A的 n n n个特征值 λ 1 ≤ λ 2 ≤ ⋯ ≤ λ n \lambda_1≤\lambda_2≤\cdots≤\lambda_n λ1≤λ2≤⋯≤λn
以及这 n n n个特征值所对应的特征向量 ( w 1 , w 2 , . . . , w n ) (w_1,w_2,...,w_n) (w1,w2,...,wn)
那么矩阵 A A A 就可以用下式的特征分解表示
A = W ∑ W − 1 A=W\sum W^{-1} A=W∑W−1
令 M M M 为 n x n nxn nxn矩阵,其特征值为 λ 1 , λ 2 , ⋯ , λ n \lambda_1,\lambda_2,\cdots,\lambda_n λ1,λ2,⋯,λn,特征向量为 V 1 , V 2 , . . . , V n V_1,V_2,...,V_n V1,V2,...,Vn,形成线性无关集合,以每个特征向量为列构成矩阵 A A A,如下所示
A = [ V 1 , V 2 , . . . , V n ] A=[V_1,V_2,...,V_n] A=[V1,V2,...,Vn]
矩阵 A A A 可以将矩阵 M M M对角化,乘积矩阵 A − 1 M A A^{-1}MA A−1MA 的主对角元素是矩阵 M M M 的特征值(
这是个定理,记住就行,证明的话自己百度一下就有
):
A − 1 M A = [ λ 1 0 ⋯ 0 0 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ n ] A^{-1}MA=\begin{bmatrix} \lambda_1 & 0 & \cdots & 0 \\\\ 0 & \lambda_2 & \cdots & 0 \\\\ \vdots & \vdots & \ddots & \vdots \\\\ 0 & 0 & \cdots & \lambda_n \\\\ \end{bmatrix} A−1MA= λ10⋮00λ2⋮0⋯⋯⋱⋯00⋮λn ,记为 Λ \varLambda Λ
此时等号两边左同乘A得 A A − 1 M A = A Λ AA^{-1}MA=A\varLambda AA−1MA=AΛ,因为 Λ \varLambda Λ是一个对角矩阵,所以可以随便移动位置,化简得 E M A = Λ A EMA=\varLambda A EMA=ΛA,又因为单位矩阵 E E E乘以任何矩阵 M M M都为 M M M,可以得到 M A = Λ A MA=\varLambda A MA=ΛA, A A A是矩阵 M M M对应特征值 Λ \varLambda Λ的特征向量
反之,如果存在可逆矩阵 A A A,使 A − 1 M A A^{-1}MA A−1MA为对角矩阵,则矩阵 A A A的列等于矩阵 M M M的特征向量, A − 1 M A A^{-1}MA A−1MA的主对角元素为矩阵 M M M的特征值
通过一个正交变换做到的, P − 1 A P = Λ P^{-1}AP=\varLambda P−1AP=Λ
Λ \varLambda Λ是对角矩阵,它就是对角线的值是矩阵所有特征值构成的矩阵
[ λ 1 0 ⋯ 0 0 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ n ] \begin{bmatrix} \lambda_1 & 0 & \cdots & 0 \\\\ 0 & \lambda_2 & \cdots & 0 \\\\ \vdots & \vdots & \ddots & \vdots \\\\ 0 & 0 & \cdots & \lambda_n \\\\ \end{bmatrix} λ10⋮00λ2⋮0⋯⋯⋱⋯00⋮λn
P 是正交矩阵,正交矩阵的定义是P的逆等于P的转置 P − 1 = P T P^{-1}=P^T P−1=PT
正交矩阵的性质,是行和列相互之间是正交的,一个向量组 ( x 1 , x 2 , … , x n ) (x_1,x_2,…,x_n) (x1,x2,…,xn),其中当 i i i不等于 j j j时, x i x_i xi和 x j x_j xj内积是 0 0 0。如果 i = j i=j i=j,那么向量内积就是1,其实它就是我们几何里面垂直的概念的抽象
P Λ P − 1 = A P\varLambda P^{-1} = A PΛP−1=A
我们可以把一个矩阵拆分成,一个正交阵和 Λ \varLambda Λ还有正交阵的逆的乘积的,这就是我们的特征值分解
3. 多元函数的泰勒展开
一元泰勒展开公式: f ( x ) = f ( x 0 ) + f ′ ( x 0 ) 1 ! ⋅ ( x − x 0 ) 1 + f ′ ′ ( x 0 ) 2 ! ⋅ ( x − x 0 ) 2 + f ′ ′ ′ ( x 0 ) 3 ! ⋅ ( x − x 0 ) 3 + . . . + f n ( x 0 ) n ! ⋅ ( x − x 0 ) n + R N ( 余项 O ( ( x − x 0 ) n ) ) f(x) = f(x_0)+\dfrac{f^{'}({x_0})}{1!}·(x-x_0)^1+\dfrac{f^{''}({x_0})}{2!}·(x-x_0)^2+\dfrac{f^{'''}({x_0})}{3!}·(x-x_0)^3+...+\dfrac{f^{n}({x_0})}{n!}·(x-x_0)^n + RN(余项O((x-x^0)^n)) f(x)=f(x0)+1!f′(x0)⋅(x−x0)1+2!f′′(x0)⋅(x−x0)2+3!f′′′(x0)⋅(x−x0)3+...+n!fn(x0)⋅(x−x0)n+RN(余项O((x−x0)n))
至于多元的,因为我们研究的基本不超过2元,所以只展开2项
f ( x ) = f ( x k ) + [ ∇ f ( x k ) ] T ( x − x k ) + 1 2 [ x − x k ] T H ( x k ) [ x − x k ] + O n f(x) = f({x}_{k})+[\nabla f(x_k)]^T(x-x_k)+\dfrac{1}{2}[x-x_k]^TH(x_k)[x-x_k]+O^{n} f(x)=f(xk)+[∇f(xk)]T(x−xk)+21[x−xk]TH(xk)[x−xk]+On
其中 H ( x k ) H(x_k) H(xk)就是hessian矩阵 [ ∂ 2 f ( x k ) ∂ x 1 2 ∂ 2 f ( x k ) ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ( x k ) ∂ x 1 ∂ x n ∂ 2 f ( x k ) ∂ x 2 ∂ x 1 ∂ 2 f ( x k ) ∂ x 2 2 ⋯ ∂ 2 f ( x k ) ∂ x 2 ∂ x n ⋯ ⋯ ⋯ ⋯ ∂ 2 f ( x k ) ∂ x n ∂ x 1 ∂ 2 f ( x k ) ∂ x n ∂ x 2 ⋯ ∂ 2 f ( x k ) ∂ x n 2 ] \begin{bmatrix} \dfrac{\partial^2 f(x_k)}{\partial x_1 ^2} & \dfrac{\partial^2 f(x_k)}{\partial x_1 \partial x_2} & \cdots & \dfrac{\partial^2 f(x_k)}{\partial x_1 \partial x_n}\\\\ \dfrac{\partial^2 f(x_k)}{\partial x_2 \partial x_1} & \dfrac{\partial^2 f(x_k)}{\partial x_2^2} & \cdots & \dfrac{\partial^2 f(x_k)}{\partial x_2 \partial x_n}\\\\ \cdots & \cdots & \cdots & \cdots\\\\ \dfrac{\partial^2 f(x_k)}{\partial x_n \partial x_1} & \dfrac{\partial^2 f(x_k)}{\partial x_n \partial x_2} & \cdots & \dfrac{\partial^2 f(x_k)}{\partial x_n^2} \end{bmatrix} ∂x12∂2f(xk)∂x2∂x1∂2f(xk)⋯∂xn∂x1∂2f(xk)∂x1∂x2∂2f(xk)∂x22∂2f(xk)⋯∂xn∂x2∂2f(xk)⋯⋯⋯⋯∂x1∂xn∂2f(xk)∂x2∂xn∂2f(xk)⋯∂xn2∂2f(xk)
f ( x k ) f(x_k) f(xk)是标量,而且是个常数,零次项
接下来看一次项,注意 ( x − x k ) (x-x_k) (x−xk)是个向量
[ ∇ f ( x k ) ] T ( x − x k ) [\nabla f(x_k)]^T(x-x_k) [∇f(xk)]T(x−xk):是把梯度和 ( x − x k ) (x-x_k) (x−xk)做内积
而二次项的内积,自然需要用hessian矩阵,是和 hessian 矩阵做内积
[ x − x k ] T H ( x k ) [ x − x k ] [x-x_k]^TH(x_k)[x-x_k] [x−xk]TH(xk)[x−xk],不就是前面二次型吗, x T A x ⇒ a x 2 x^TAx\Rightarrow ax^2 xTAx⇒ax2
知道公式就行了,后面我们在推导梯度下降法,牛顿法,还有拟牛顿法的时候都会用到,到时候自然会加深理解
4. 矩阵和向量的求导公式
知道这些常用的即可,推导机器学习公式会用到
∇ w T x = w \nabla w^T x = w ∇wTx=w
证明如下:
{ w T x = ∑ i = 1 n w i x i 不断对 x i 依次求偏导,因为每个 x i 都是一次的,求导为 1 ,最终得到的就是 w i 所以对 x 求偏导最终结果就是 w \begin{cases} w^T x = \displaystyle\sum_{i=1}^n w_i x_i\\\\ 不断对x_i依次求偏导,因为每个x_i都是一次的,求导为1,最终得到的就是w_i\\\\ 所以对x求偏导最终结果就是w \end{cases} ⎩ ⎨ ⎧wTx=i=1∑nwixi不断对xi依次求偏导,因为每个xi都是一次的,求导为1,最终得到的就是wi所以对x求偏导最终结果就是w
- ∂ A B ∂ B = A T \dfrac{\partial AB}{\partial B} = A^T ∂B∂AB=AT:对两个相乘向量形式的其中一个向量求偏导(偏导对象非转置),为非偏导对象的转置
- ∂ A T B A = B \dfrac{\partial A^TB}{A}=B A∂ATB=B:对两个相乘向量形式的其中一个向量求偏导,如果形式中偏导对象是转置形式给出的,结果是非偏导对象(不是转置)
- ∂ X T A X ∂ X = 2 A X \dfrac{\partial X^T A X}{\partial X}=2AX ∂X∂XTAX=2AX: A A A是对称矩阵时才成立,如果不是对称矩阵,可以看下面的推导
另外,假设有一个矩阵A, A T A A^TA ATA本身就是对称的,这是定理,一个矩阵乘以自己的转置,结果为一个对称矩阵
∇ x T A x = ( A + A T ) x \nabla x^TAx = (A+A^T)x ∇xTAx=(A+AT)x
二阶导就是再一次对 x x x求导
∇ 2 x T A x = A + A T \nabla^2x^TAx = A+A^T ∇2xTAx=A+AT
5. 奇异值(SVD)分解
分解就是对角化
A = U ∑ V T A=U\sum V^T A=U∑VT
前面的知识表明了一件事,对一个n阶方阵而言,可以进行分解(对角化,在特征值和特征向量介绍过)。但如果 A不是一个方阵,这种分解(对角化 A = P Λ P − 1 A=P\varLambda P^{-1} A=PΛP−1)将是无效的
奇异值分解比较神奇,可以应用于任意形状矩阵,如果 A A A是一个 m ∗ n m*n m∗n 的矩阵,它一样可以分解成为三个矩阵的乘积 U , V 和 ∑ U,V和\sum U,V和∑
其中 U 和 V U和V U和V 都是正交矩阵, ∑ \sum ∑是对角矩阵,注意这里 ∑ ∑ ∑并不是一个方阵,而是 m ∗ n m*n m∗n 的矩阵
[ λ 1 0 ⋯ 0 0 λ 2 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ λ n ] \begin{bmatrix} \lambda_1 & 0 & \cdots & 0 \\\\ 0 & \lambda_2 & \cdots & 0 \\\\ \vdots & \vdots & \ddots & \vdots \\\\ 0 & 0 & \cdots & \lambda_n \\\\ \end{bmatrix} λ10⋮00λ2⋮0⋯⋯⋱⋯00⋮λn
SVD 也是对矩阵进行分解(对角化),但是和特征分解不同,SVD 并不要求要分解的矩阵为方阵。
假设我们的矩阵 A A A 是一个 m × n m×n m×n的矩阵,那么我们定义矩阵 A A A的 S V D SVD SVD为: A = U ∑ V T A=U\sum V^T A=U∑VT
U U U是 A A T AA^T AAT的正交化特征向量所构成的矩阵,所以是 m ∗ m m*m m∗m的矩阵(对称的)
V V V是 A T A A^TA ATA(注意 A T A^T AT的位置,和 U U U是反过来的)的正交化特征向量所构成的矩阵,是 n ∗ n n*n n∗n的矩阵
∑ \sum ∑是一个 m ∗ n m*n m∗n 的矩阵,除了主对角线上的元素以外全为 0,主对角线上的每个元素都称为奇异值
U U U是一个 m ∗ m m*m m∗m 的矩阵, V V V是一个 n ∗ n n*n n∗n的矩阵
U 和 V U和V U和V都是酉矩阵
满足 U T U = E U^TU = E UTU=E, V T V = E V^TV = E VTV=E
下图可形象的看出上面关于SVD的定义
∑ T ∑ = ∑ 2 \sum^T\sum = \sum^2 ∑T∑=∑2
6. 奇异值分解如何求解
那么我们如何求出 S V D SVD SVD 分解后的 U , ∑ , V U,∑,V U,∑,V 这三个矩阵呢?
如果我们将 A T A^{T} AT和 A A A做矩阵乘法,那么会得到 n × n n×n n×n的一个方阵 。既然 A T A A^TA ATA是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足:
( A T A ) v i = λ i v i (A^TA)v_i = \lambda_i v_i (ATA)vi=λivi
这样我们就可以得到矩阵 A T A A^{T}A ATA的 n n n个特征值和对应的 n n n个特征向量 v v v了
将 A T A A^TA ATA的所有特征向量张成一个 n ∗ n n*n n∗n 的矩阵 V V V,就是我们 S V D SVD SVD 公式里面的 V V V矩阵了。一般我们将 V V V中的每个特征向量叫做 A A A 的右奇异向量
如果我们将 A A T AA^T AAT做矩阵乘法 ,那么会得到 m ∗ m m*m m∗m 的一个方阵 A A T AA^T AAT,既然 A A T AA^T AAT是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足:
( A A T ) u i = λ i u i (AA^T)u_i = \lambda_i u_i (AAT)ui=λiui
这样我们就可以得到矩阵 A A T AA^T AAT的 m m m 个特征值和对应的 m m m 个特征向量 u u u了
将 A A T AA^T AAT的所有特征向量张成一个 m ∗ m m*m m∗m 的矩阵 U U U,就是我们 S V D SVD SVD 公式里面的 U U U矩阵了。一般我们将 U U U 中的每个特征向量叫做 A A A的左奇异向量。
U U U和 V V V都求出来了,现在就剩下奇异值矩阵 ∑ \sum ∑没有求出了。
由于 ∑ \sum ∑除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值 σ \sigma σ就可以了。我们注意到:
A = U ∑ V T A=U\sum V^T A=U∑VT
A V = U ∑ V T V AV=U\sum V^TV AV=U∑VTV
A V = U ∑ AV = U\sum AV=U∑:前面说过 U 和 V U和V U和V都是酉矩阵,满足 U T U = E U^TU = E UTU=E, V T V = E V^TV = E VTV=E
A v i = σ i u i Av_i=\sigma_i u_i Avi=σiui: u i 是 U 矩阵第 i 列 u_i是U矩阵第i列 ui是U矩阵第i列, σ i 和 v i 同理 \sigma_i和v_i同理 σi和vi同理,方便我们求出 σ i \sigma_i σi
σ i = A v i u i \sigma_i = \dfrac{Av_i}{u_i} σi=uiAvi
这样我们可以求出我们的每个奇异值,进而求出奇异值矩阵 Σ Σ Σ。
还有一个问题,我们说 A T A A^TA ATA的特征向量组成的就是我们 S V D SVD SVD 中的 V V V矩阵,而 A A T AA^T AAT的特征向量组成的就是我们 S V D SVD SVD 中的 U U U矩阵,这有什么根据吗?
以矩阵 V V V为例,由上一节已知 U T U = E U^TU = E UTU=E, ∑ T ∑ = ∑ 2 \sum^T\sum = \sum^2 ∑T∑=∑2
{ A = U ∑ V T A T = V ∑ T U T A T A = V ∑ T U T U ∑ V T = V ∑ 2 V T \begin{cases} A=U\sum V^T\\\\ A^T = V\sum^T U^T\\\\ A^TA=V\sum^TU^TU\sum V^T=V\sum^2V^T \end{cases} ⎩ ⎨ ⎧A=U∑VTAT=V∑TUTATA=V∑TUTU∑VT=V∑2VT
可以看出 A T A A^TA ATA的特征向量组成的就是 S V D SVD SVD的 V V V矩阵。而同样的证明步骤可以推出 A A T AA^T AAT的特征向量组成的就是我们 S V D SVD SVD 中的 U U U矩阵
进一步我们还可以看出我们的特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:
σ i = λ i \sigma_i = \sqrt{\lambda_i} σi=λi
这样也就是说,我们可以不用 σ i = A v i u i \sigma_i = \dfrac{Av_i}{u_i} σi=uiAvi来计算奇异值,也可以通过求出 A T A A^TA ATA的特征值取
平方根
来求奇异值。
7. 奇异值分解性质
费这么大的力气做SVD 有什么好处, SVD 有什么重要的性质值得我们注意呢?
对于奇异值,它跟我们特征分解中的特征值类似,在奇异值矩阵中也是按照从大到小排列,而且奇异值的减少特别的快,在很多情况下,前 10%甚至 1%的奇异值的和就占了全部的奇异值之和的 99%以上的比例
也就是说,我们也可以用最大的k个的奇异值和对应的左右奇异向量来近似描述矩阵。
A m ∗ n = U m ∗ m ∑ m ∗ n V n ∗ n T A_{m*n} = U_{m*m}\sum_{m*n} V^T_{n*n} Am∗n=Um∗m∑m∗nVn∗nT ≈ U m ∗ k ∑ k ∗ k V k ∗ n T ≈U_{m*k}\sum_{k*k}V^T_{k*n} ≈Um∗k∑k∗kVk∗nT
其中k要比n小很多,也就是一个大的矩阵 A A A 可以用三个小的矩阵
U m ∗ k ∑ k ∗ k V k ∗ n T U_{m*k}\sum_{k*k}V^T_{k*n} Um∗k∑k∗kVk∗nT来表示
如下图所示,现在我们的矩阵 A A A只需要 3 3 3个小矩阵就可以近似描述了
U U U 的
每一列
都是标准正交的(orthonormal)
, V T V^T VT每一行
都是标准正交的
。 Σ Σ Σ是呈对角线的(diagonal),只有对角线有值,而且一定都是非负的
意味着对角线一定有值,但是也有可能值是0,而且神奇的地方,如果左上角有值 σ 1 σ1 σ1,第二个左上角值是 σ 2 σ2 σ2,那么 σ 1 σ1 σ1 一定大于等于 σ 2 σ2 σ2,并且 σ 2 σ2 σ2 大于等于 σ 3 σ3 σ3,以此类推
σ 1 ≥ σ 2 ≥ ⋯ ≥ σ k > 0 \sigma_1 ≥ \sigma_2 ≥ \cdots ≥ \sigma_k > 0 σ1≥σ2≥⋯≥σk>0
所以 ∑ \sum ∑中有 k 个非 0 k个非0 k个非0的值,依次从左上角往右下角方向排列,我们可以把 ∑ \sum ∑中等于 0 0 0的行列去掉就保留 k ∗ k k*k k∗k个值,那么U和V中也分别只保留 k k k列和 k k k行,我们会发现一样乘回来可以得到 A A A 仍然不变。
但是如果我们保留的 小于 k 个 小于k个 小于k个,那么乘回去的矩阵就 不等于原来的 A 了 不等于原来的 A了 不等于原来的A了。如果 去掉的是第 k 个 去掉的是第 k个 去掉的是第k个,那么乘回来的矩阵就是 A + A+ A+,是 最接近 A 的矩阵 最接近 A的矩阵 最接近A的矩阵
还比如可以求解对称矩阵的逆矩阵,可以用于降维算法中的特征分解 还可以用于推荐系统,以及自然语言里面的主题分析里面,会用到这个算法的
SVD可用于数据压缩
奇异值分解在数值计算是非常有用的,首先可以做矩阵的压缩
import numpy as np
arr = np.array([[0, 0, 0, 2, 2],
[0, 0, 0, 3, 3],
[0, 0, 0, 1, 1],
[1, 1, 1, 0, 0],
[2, 2, 2, 0, 0],
[5, 5, 5, 0, 0],
[1, 1, 1, 0, 0]])
# 1. 分解
u, sigma, v = np.linalg.svd(arr)
# 2. 重构
new_arr = np.mat(u[:, 0:2]) * np.mat(np.diag(sigma[0:2])) * np.mat(v[0:2, :])
SVD 可用于 PCA 降维(python的Scikit-learn库中的PCA就是用SVD实现)
在中心化后 由于特征的均值变为0,所以数据的协方差矩阵 C C C可以用 E ( X X T ) 或 1 m X X T E(XX^T)或\dfrac{1}{m}XX^T E(XXT)或m1XXT来表示, X T X^T XT为矩阵的转置。这里 X X X每一行为一个特征。当然也可以表示为 E ( X T X ) E(X^TX) E(XTX)或者 1 m X T X \dfrac{1}{m}X^TX m1XTX,这时每一行为一个样本。
SVD 分解得到的三个矩阵分别称为:左奇异向量,奇异值矩阵,右奇异向量。
左奇异向量用于压缩行,右奇异向量压缩列
压缩方法均是取奇异值较大的左奇异向量或者右奇异向量与原数据 C C C相乘。
SVD可用于协调过滤(推荐算法中的内容)
可以直接计算 jim 与其余三个用户的相似度,然后选最相似的样本来为 Jim 的两个空位打分。但是这样,如果一旦样本、特征过多,计算量就猛增。
而事实上,我们不一定需要那么多特征,因此可以使用 S V D SVD SVD 分解把样本映射到低维空间。(事实上,容易能从数据中看出来映射 2维空间,左边三个和右边两个明显不一样,左边三个是日料,右边两个偏欧美的饮食风格)
food = np.mat([[2, 0, 0, 4, 4], [5, 5, 5, 3, 3], [2, 4, 2, 1, 2], [1, 1, 1, 5, 4]])
u, sigma, v = np.linalg.svd(food)
simple_food = np.mat(u[:, 0:2]) * np.mat(np.diag(sigma[0:2])) * np.mat(v[0:2, :])
8. SVD 用于矩阵求逆
在矩阵求逆过程中,矩阵通过 SVD 转换到正交空间,不同得奇异值和奇异值向量代表了系统矩阵中不同的线性无关(或独立)项。
对矩阵进行 SVD 分解,形式如下所示:
[ H ] n ∗ v = [ U ] n ∗ n [ ∑ ] n ∗ v [ V ] v ∗ v T = ∑ i = 1 n { U i } n σ i { V i } v T [H]_{n*v}=[U]_{n*n} [\sum]_{n*v} [V]_{v*v}^T=\displaystyle\sum_{i=1}^n\{U_i\}_n \sigma_i\{V_i\}_{v}^T [H]n∗v=[U]n∗n[∑]n∗v[V]v∗vT=i=1∑n{Ui}nσi{Vi}vT
奇异值矩阵为: [ ∑ ] = [ σ 1 0 ⋯ ⋯ 0 σ 2 ⋯ ⋯ 0 ⋯ ⋯ ⋯ 0 ⋯ ⋯ σ n ] [\sum] = \begin{bmatrix} \sigma_1 & 0 & \cdots & \cdots \\\\ 0 & \sigma_2 & \cdots & \cdots \\\\ 0 & \cdots & \cdots & \cdots \\\\ 0 & \cdots & \cdots & \sigma_n \end{bmatrix} [∑]= σ10000σ2⋯⋯⋯⋯⋯⋯⋯⋯⋯σn
当用 SVD 方法进行求逆时,会使得求逆运算变得非常简单,这是因为通过 SVD 求逆,只需要对奇异值求倒数即可
而对于一个正交阵 B B B,有 B − 1 = B T B^{-1}=B^T B−1=BT这个性质。因此,其求逆形式为:
上面特性中我们讲过 U U U 的
每一列
都是标准正交的(orthonormal)
, V T V^T VT每一行
都是标准正交的
。 Σ Σ Σ是呈对角线的(diagonal),只有对角线有值,而且一定都是非负的
{ [ H − 1 ] n ∗ v = ( [ V ] v ∗ v T ) − 1 ( [ ∑ ] n ∗ v ) − 1 ( U n ∗ n ) − 1 = [ V ] v ∗ v [ ∑ − 1 ] v ∗ n [ U ] n ∗ n T = ∑ i = 1 n V i v σ i − 1 U i n T \begin{cases} [H^{-1}]_{n*v} = ([V]_{v*v}^T)^{-1}([\sum]_{n*v})^{-1}(U_{n*n})^{-1}\\\\ =[V]_{v*v}[\sum^{-1}]_{v*n}[U]^{T}_{n*n}\\\\ =\sum_{i=1}^n {V_i}_v \sigma_i^{-1} {U_i}_n^{T} \end{cases} ⎩ ⎨ ⎧[H−1]n∗v=([V]v∗vT)−1([∑]n∗v)−1(Un∗n)−1=[V]v∗v[∑−1]v∗n[U]n∗nT=∑i=1nVivσi−1UinT
[ ∑ − 1 ] v ∗ n = [ σ 1 − 1 0 ⋯ ⋯ 0 σ 2 − 1 ⋯ ⋯ 0 ⋯ ⋯ ⋯ 0 ⋯ ⋯ σ n − 1 ] [\sum^{-1}]_{v*n} = \begin{bmatrix} \sigma_1^{-1} & 0 & \cdots & \cdots \\\\ 0 & \sigma_2^{-1} & \cdots & \cdots \\\\ 0 & \cdots & \cdots & \cdots \\\\ 0 & \cdots & \cdots & \sigma_n^{-1} \end{bmatrix} [∑−1]v∗n= σ1−10000σ2−1⋯⋯⋯⋯⋯⋯⋯⋯⋯σn−1
可以看出,
SVD 求逆是原始奇异值的倒数
,这就使得通过 S V D SVD SVD 对矩阵求逆变得非常简单
奇异值求倒数,奇异矩阵转置 奇异值求倒数,奇异矩阵转置 奇异值求倒数,奇异矩阵转置