奇异值分解SVD以及与特征值的关系
1、SVD奇异值分解:
一个矩阵A,A.shape = (n,c),即n行c列,将A分解成如下形式:U、V是方阵,是正交矩阵,UU' = U'U = E,VV' = V'V = E,U叫左奇异矩阵,V叫右奇异矩阵,U.shape = (n,n),V.shape = (c,c),∑只有主对角线上有值,称为奇异值,其它元素均为0,∑.shape = (n,c),这就叫SVD分解。2、SVD的具体实现:
numpy.linalg.svd实现上可以通过参数控制是full SVD还是reduced SVD,full SVD分解出来的各个矩阵的shape如上所述,reduced SVD,只是简化了表达,考虑从分解形态还原到原始矩阵A的过程,因为∑的特殊结构,U真正起到作用的就是U[:,:c](后面的列在U∑计算中都是乘的0),所以reduced SVD,U.shape = (n,c),∑.shape = (c,c) - 实际linalg.svd,返回的只是一个奇异值组成的1d-array,V.shape = (c,c),这种情况下U'U是shape为(c,c)的单位矩阵,但UU'并不是单位矩阵。
full SVD和reduced SVD重构对比:
注1:np.allclose是比较两个矩阵是否相同
注2:np.diag(s)是把一个1d-array变成一个对角矩阵,除了主对角线有值,其余均为0
注3:u[:,:6] * s的计算方式是,u[:,:6]是6列,s中是含6个元素的1d-array,是每个元素分别乘对应的列,u * s = np.dot(u,np.diag(s))
红色下划线是相同的,橘色下划线算出来的结果也是相同的。3、SVD和特征值之间的关系
V就是特征矩阵,特征值λi = si^2。
简单来说,就是把原始矩阵构造成A'A
A'A是一个对称矩阵,可以进行特征值分解,A'A = VLV',所以V就是特征向量,特征值λi = si^2。参考链接中的情形是:A如果是中心化后的原始数据,那么A'A/n恰好是协方差矩阵,协方差矩阵特征值分解,λi = si^2/n,会多除以一个n,这里要灵活点,因为PCA中原始数据中心化后,对A'A进行特征值分解不除n,也可得到特征向量,这种情况λi = si^2。
留言
張貼留言