奇异值分解(SVD)原理

news/2024/5/19 23:41:19 标签: SVD, 奇异值分解, 推荐算法

一、特征值和特征向量

A A A n n n阶方阵,如果存在常数及非零 n n n向量 x x x,使得 A x = λ x Ax=\lambda x Ax=λx,则 λ \lambda λ称是矩阵 A A A的特征值, x x x A A A属于特征值 λ \lambda λ的特征向量。给定 n n n阶矩阵 A A A,行列式
在这里插入图片描述
的结果是关于 λ \lambda λ的一个多项式,成为矩阵 A A A的特征多项式,该特征多项式构成的方程 ∣ λ E − A ∣ = 0 |\lambda E-A|=0 λEA=0称为矩阵 A A A的特征方程。

定理: n n n阶矩阵 A A A n n n个特征值就是其特征方程 ∣ λ E − A ∣ = 0 |\lambda E-A|=0 λEA=0 n n n个跟 λ 1 , λ 2 , λ 3 , . . . , λ n \lambda_1,\lambda_2,\lambda_3,...,\lambda_n λ1,λ2,λ3,...,λn;而 A A A的属于特征值 λ i \lambda_i λi的特征向量就是其次线性方程 ( λ i E − A ) x = 0 (\lambda_i E-A)x=0 (λiEA)x=0的非零解。

例: A = ∣ 1 − 2 1 4 ∣ A=\begin{vmatrix} 1&-2 \\ 1&4 \end{vmatrix} A=1124的特征根和特征向量。

解: ∣ λ E − A ∣ = ∣ λ − 1 − 2 1 λ − 4 ∣ = ( λ − 1 ) ( λ − 4 ) + 2 = 0 |\lambda E-A|=\begin{vmatrix} \lambda-1&-2 \\ 1&\lambda-4 \end{vmatrix}=(\lambda-1)(\lambda-4)+2=0 λEA=λ112λ4=(λ1)(λ4)+2=0,解一元二次方程可得 λ i = 2 , λ 2 = 3 \lambda_i=2,\lambda_2=3 λi=2,λ2=3

λ 1 \lambda_1 λ1对应的特征向量为 x x x满足 ( λ i E − A ) x = 0 (\lambda_i E-A)x=0 (λiEA)x=0,求得 x = k 1 ( 2 , − 1 ) T , k 1 ≠ 0 x=k_1(2,-1)^T,k_1\neq0 x=k1(2,1)T,k1̸=0
λ 2 \lambda_2 λ2对应的特征向量为 x x x满足 ( λ i E − A ) x = 0 (\lambda_i E-A)x=0 (λiEA)x=0,求得 x = k 2 ( 1 , − 1 ) T , k 2 ≠ 0 x=k_2(1,-1)^T,k_2\neq0 x=k2(1,1)T,k2̸=0

二、特征分解

特征值分解是将一个矩阵分解成下面的形式:
A = Q Σ Q − 1 A=QΣ Q^{-1} A=QΣQ1
其中 Q Q Q是这个矩阵 A A A的特征向量组成的矩阵,正交矩阵是可逆的。 Σ   =   d i a g ( λ 1 ,   λ 2 ,   . . . ,   λ n ) Σ = diag(λ_1, λ_2, ..., λ_n) Σ=diag(λ1,λ2,...,λn)是一个对角阵,每一个对角线上的元素就是一个特征值。
Q Q Q的这 n n n个特征向量标准化,即满足 ∣ ∣ q i ∣ ∣ 2 = 1 ||qi||_2=1 qi2=1, 或者说 q i T w i = 1 q^T_iw_i=1 qiTwi=1,此时 Q Q Q n n n个特征向量为标准正交基,满足 Q T Q = I Q^TQ=I QTQ=I,即 Q T = Q − 1 Q^T=Q−1 QT=Q1, 也就是说 Q Q Q为酉矩阵。

这样我们的特征分解表达式可以写成
A = Q Σ Q T A=QΣ Q^{T} A=QΣQT

三、奇异值分解

SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。假设我们的矩阵 A A A是一个 m × n m×n m×n的矩阵,那么我们定义矩阵 A A ASVD为:
A = U Σ V T A=UΣV^T A=UΣVT
其中 U U U是一个 m × m m×m m×m的矩阵, Σ Σ Σ是一个 m × n m×n m×n的矩阵,除了主对角线上的元素以外全为0,主对角线上的每个元素都称为奇异值, V V V是一个 n × n n×n n×n的矩阵。 U U U V V V都是酉矩阵,即满足 U T U = I , V T V = I UTU=I,VTV=I UTU=I,VTV=I

如何求 U , Σ , V U,Σ,V U,Σ,V

A A A的转置和 A A A做矩阵乘法,那么会得到 n × n n×n n×n的一个方阵 A T A A^TA ATA。既然 A T A A^TA ATA是方阵,那么就可以进行特征分解,得到的特征值和特征向量满足下式:
( A T A ) v i = λ i v i (A^TA)v_i=λ_iv_i (ATA)vi=λivi
这样就得到矩阵 A T A A^TA 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矩阵了。

将A和A的转置做矩阵乘法,那么会得到 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=λ_iu_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 V V V都求出来了,现在就剩下奇异值矩阵 Σ Σ Σ。由于 Σ Σ Σ除了对角线上是奇异值其他位置都是0,那我们只需要求出每个奇异值 σ σ σ就可以了。
A = U Σ V T ⇒ A V = U Σ V T V ⇒ A V = U Σ ⇒ A v i = σ i u i ⇒ σ i = A v i / u i A=UΣV^T⇒AV=UΣV^TV⇒AV=UΣ⇒Av_i=σ_iu_i⇒σ_i=Av_i/u_i A=UΣVTAV=UΣVTVAV=UΣAvi=σiuiσi=Avi/ui
这样可以求出我们的每个奇异值,进而求出奇异值矩阵 Σ Σ Σ


http://www.niftyadmin.cn/n/482957.html

相关文章

MySQL数据库 - 查找距今超过10年的年份数据

datediff并不好用,原谅我不会用。 查找距今超过10年的年份数据 mysql> select * from mydate where timestampdiff(year,bir,now())>10; 附: 年份区间内: mysql> select * from mydate where bir between 1900-1-1 and 1999-12…

SVM(支持向量机)

搞懂间隔 给定训练样本集D{(x1,y1),(x2,y2),...,(xm,ym)},yi∈{−1,1}D{\{(x_{1},y_{1}),(x_{2},y_{2}),...,(x_{m},y_{m})\}},y_{i} \in \{-1,1\}D{(x1​,y1​),(x2​,y2​),...,(xm​,ym​)},yi​∈{−1,1},分类学习最基本的想法就是基于训练集DDD在样本空间中找到…

MySQL - 新增一列和查找主键

新增一列,可为null mysql> alter table mydate add column sex varchar(10); 不可为null mysql> alter table mydate add column name varchar(50) not null; 添加到谁后面 mysql> alter table mydate add column sal varchar(10) after name; 添加…

MySQL - 替换,大小写,拼接,取几位,长度

//长度 length(catName) //取第一位字符 substring(catName,1,1) //转大写 upper(substring(catName,1,1)) //转小写 lower(substring(catName,1,length(catName))) //拼接concat("","",""),前两个参数是需要拼接的字符串,最后一个为…

MySQL - 分组,排序,取出单独的年月日

分组 mysql> select sal from test4 group by testname; 找出所有分组中薪资最少的并在各组最少的中找出大于500的 //这里最大最小的就不说了,看一下就懂,注意having是筛选的函数 mysql> select min(sal),testname from test4 group by testnam…

iOS开发 - placeholder偏上的问题

在placeholder字体偏小的时候,会出现placeholder偏上的现象,我们通过KVC来改变placeholder字体大小或者颜色,要解决placeholder偏上问题需要如下几句代码,不需要很麻烦的自定义: [_phoneNum setValue:[UIFont systemFo…

iOS开发 - 封装一个自己的按钮

有时候,你会看到设计出来的界面某个位置可点击,但是直接用按钮又无法控制几个元素的关系,这个时候与其用多个控件组合出来这样的按钮不如自己封装一个来的快,还可以重复使用。虽然也需要计算元素的位置大小,但是多次使…

iOS开发 - 解析tabbar中的凸起按钮

你是否看到过这样的tabbar: 中间是一个凸起的tabbar,一开始博主这么想的: 1.在tabbar上增加一个按钮,但是我们知道,如果按钮大小超出superView的范围将会失去响应,这里要注意,只是超出去的部…