svd分解 复原 sklearn和numpy实现
网上有很多分析svd分解原理的文章,例如下面的链接,
svd原理解释,本文主要介绍在sklearn和numpy中,如何进行svd分解以及如何复原,可以利用到图像压缩和复原等任务中。
原理
1.pca的主要过程
pca可以将m∗nm*nm∗n的矩阵AAA进行降维,需要先求出A的协方差矩阵C=1mATAC=\frac{1}{m}A^{T}AC=m1ATA,再求出CCC的特征值和特征向量,并将前kkk大的特征值对应的特征向量按列拼接,得到P∈n∗kP \in n*kP∈n∗k,最后得到降维后的矩阵Anew=AP∈m∗kA_{new}=AP \in m*kAnew=AP∈m∗k
2.svd的主要过程
svd的主要作用就也是将一个m∗nm*nm∗n的矩阵AAA进行降维,与pca不同,svd可以将一个矩阵AAA分解成A=USVTA=USV^{T}A=USVT的形式,UUU是m∗*∗m的矩阵,VVV是n∗*∗n的矩阵,SSS是m∗*∗n的对角矩阵,进行降维时,只需要计算A∗VTA*V^{T}A∗VT即可(需要取VtV^{t}Vt的前k行,才可以降维成m∗*∗ k的新矩阵)
代码实现
接下来就是具体实现了,主要对一个随机构造的矩阵xxx,进行svd降维和复原。
1. 使用sklearn进行降维和复原
首先构造数据,
from sklearn.decomposition import TruncatedSVD
from scipy.sparse import random as r
# 假设数据是5*10的
x=np.random.randint(1,10,size=[5,10])
print("原始数据\n",x)
原始数据[[4 5 5 5 9 1 4 7 3 9][7 7 3 5 2 7 3 7 8 3][3 2 5 8 4 9 4 2 6 7][7 5 2 5 8 6 5 5 9 9][5 3 4 8 9 9 1 1 1 2]]
降维,假设只保留5个主要维度,首先使用原生svd,得到降维后的结果 new_x :
#假设只保留5个主要维度
n_com=5
svd=TruncatedSVD(n_components=n_com)
svd.fit(x)
new_x=svd.transform(x)
# 降维后的结果
print(new_x)
[[16.34513059 -4.8106942 -5.82035261 -0.90765052 -1.73020042][16.20910717 -1.61394637 6.43060373 -2.77069517 -1.27695179][16.36007388 3.50982968 1.07136253 4.50162336 -1.61760551][19.80727866 -3.17339531 0.55105757 1.28356345 3.26344521][14.51824224 7.59233143 -2.58588072 -2.70863565 0.744083 ]]
也可以进行手工降维,主要用到svd.components_:
# 手工降维,right即为svd分解后的右矩阵
right=svd.components_
print(right.shape)
# 计算
print(np.dot(x,right[:,:].T))
(5, 10)
[[16.34513059 -4.8106942 -5.82035261 -0.90765052 -1.73020042][16.20910717 -1.61394637 6.43060373 -2.77069517 -1.27695179][16.36007388 3.50982968 1.07136253 4.50162336 -1.61760551][19.80727866 -3.17339531 0.55105757 1.28356345 3.26344521][14.51824224 7.59233143 -2.58588072 -2.70863565 0.744083 ]]
复原,可以直接得到原始的矩阵:
# sklearn可以直接复原
print(svd.inverse_transform(new_x))
[[4. 5. 5. 5. 9. 1. 4. 7. 3. 9.][7. 7. 3. 5. 2. 7. 3. 7. 8. 3.][3. 2. 5. 8. 4. 9. 4. 2. 6. 7.][7. 5. 2. 5. 8. 6. 5. 5. 9. 9.][5. 3. 4. 8. 9. 9. 1. 1. 1. 2.]]
2.使用numpy进行降维和复原
首先得到 u、s、vu、s、vu、s、v 三个矩阵
# 可以得到三个矩阵
u,s,v=np.linalg.svd(x)
print("u,s,v的形状:")
print("u:",u.shape)
print("s:",s.shape)
print("v:",v.shape)
u,s,v的形状:
u: (5, 5)
s: (5,)
v: (10, 10)
降维,利用 xxx 和 vvv 即可实现降维:
# 降维结果与sklearn基本一致,假设降维到n_com=5
print(np.dot(x,v[:n_com,:].T))
[[-16.34513059 -4.8106942 5.82035261 -0.90765052 -1.73020042][-16.20910717 -1.61394637 -6.43060373 -2.77069517 -1.27695179][-16.36007388 3.50982968 -1.07136253 4.50162336 -1.61760551][-19.80727866 -3.17339531 -0.55105757 1.28356345 3.26344521][-14.51824224 7.59233143 2.58588072 -2.70863565 0.744083 ]]
复原,需要依次取出 u、vu、vu、v 中对应的行或列,并按照 sss 矩阵中的权重值进行加权计算,可以得到原始的矩阵 xxx:
# m为原始行数,n为原始列数
m=5
n=10
# 将u、v、s三个矩阵进行运算,将结果累加到a中并返回
a=np.zeros([m,n])for i in range(0,n_com):# 依次取出u和v矩阵的对应数据,并reshape ui=u[:,i].reshape(m,1)vi=v[i].reshape(1,n)# 将其按照s的权重进行累加a+=s[i]*np.dot(ui,vi)# 结果与原始数据基本一致
print(a)
[[4. 5. 5. 5. 9. 1. 4. 7. 3. 9.][7. 7. 3. 5. 2. 7. 3. 7. 8. 3.][3. 2. 5. 8. 4. 9. 4. 2. 6. 7.][7. 5. 2. 5. 8. 6. 5. 5. 9. 9.][5. 3. 4. 8. 9. 9. 1. 1. 1. 2.]]
svd分解 复原 sklearn和numpy实现相关推荐
- Python中矩阵SVD分解及还原
python中SVD分解及还原: import numpy as np from numpy import linalg as la S = np.zeros([5,5]) A=np.random.r ...
- 李宏毅线性代数笔记13:SVD分解
1 SVD分解介绍 之前用特征值来进行对角化的时候,被对角化的矩阵一定要是方阵,但是SVD的话,非方阵也是可以的. 矩阵Σ对角线上的元素都是大于等于0的 我们可以改变U,V的一些行和列,来达到Σ对角线 ...
- 机器学习笔记(二)矩阵和线性代数 例:用Python实现SVD分解进行图片压缩
线性代数基本只要是理工科,都是必修的一门课.当时学习的时候总是有一个疑惑,这个东西到底是干嘛用的?为什么数学家发明出这么一套方法呢,感觉除了解方程没发现有什么大用啊!但随着学习的深入,慢慢发现矩阵的应 ...
- 【机器学习中的矩阵分解】LU分解、QR分解、SVD分解
学习总结 文章目录 学习总结 一.三角分解(LU分解) 1.1 高斯消元 1.2 LU分解原理 1.3 LU分解python代码 1.4 LU分解算法 二.QR分解 2.1 Schmid 正交化 2. ...
- Python—SVD分解压缩图片
奇异值分解压缩图片 对任意的A∈Crm×n有SVD分解,A=U(ΣOOO)VH其中U,V为酉矩阵,U=(u1,..,um)∈Cmm×mVH=(v1T..vnT)∈Cnn×nΣ=diag(σ1,..,σ ...
- SVD分解——潜在语义分析LSA(I)——概率性潜在语义分析PLSA(I)
SVD分解 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0. 正定矩阵:如果对于所有的非零实系数向量 z z z ...
- 奇异值SVD分解的应用探究
SVD分解的应用探究 一.特征值分解(EVD) 1.特征值 2.特征值分解过程 二.奇异值分解(SVD) 1.奇异值分解的形式 2.奇异值分解的方法 3.奇异值分解的价值 三.SVD分解在图像处理中的 ...
- 图像SVD分解与重构
图像SVD分解与重构 将图像看成一个二维矩阵,三个通道的彩色图像就是3个二维矩阵,对矩阵分别进行svd分解.svd分解是将一个矩阵A写成U∗Σ∗VTU*\Sigma*V^TU∗Σ∗VT的形式,U和V都 ...
- 从投影的角度理解 SVD 分解
前言 SVD分解是一种特别有意思的降维手段,它在降维的同时还可以发现某些潜在的隐向量,这些向量对于数据之间的潜在关系有很大的帮助. 下面我们使用一个例子来逐步导出SVD的近似分解,理解如何通过SVD来 ...
最新文章
- Visual C++ 控制栏
- 06复杂查询(多数据库表)
- python 就业需求分析_python的就业前景如何?
- php如何操作mysql数据库代码_php如何操作mysql数据库的类(附代码)
- 好好学习 天天编程—C语言之我的第一个hello world(二)
- 【以太坊源码】mpt实现
- 数据包的分类和调度-Linux TC的另一种解释
- Ubuntu中锐捷客户端的配置与使用
- 三菱plc编程有c语言吗,三菱plc编程用什么语言
- C6000 DSP技术深度探索(3)-中断向量表
- 开场PPT动画怎么做炫酷
- UVA - 10400 Game Show Math
- linux中分号转义字符,Linux职场技术篇-Linux shell中元字符、转义符、通配符的使用方法...
- android 更新相册,Android 图片存入系统相册更新显示实例详解
- 高考十年后,我成为一名高级研发工程师
- js总计_Excel总计前3名加上其他的总计
- 智慧工地安全施工实时监测系统解决方案
- 全球及中国胶粘剂和密封胶基材行业产销现状与运营前景预测报告2022版
- java提示系统找不到指定路径怎么解决?
- Raspbian命令行安装desktop界面