网上有很多分析svd分解原理的文章,例如下面的链接,
svd原理解释,本文主要介绍在sklearn和numpy中,如何进行svd分解以及如何复原,可以利用到图像压缩和复原等任务中。

原理

1.pca的主要过程

pca可以将m∗nm*nm∗n的矩阵AAA进行降维,需要先求出A的协方差矩阵C=1mATAC=\frac{1}{m}A^{T}AC=m1​ATA,再求出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实现相关推荐

  1. Python中矩阵SVD分解及还原

    python中SVD分解及还原: import numpy as np from numpy import linalg as la S = np.zeros([5,5]) A=np.random.r ...

  2. 李宏毅线性代数笔记13:SVD分解

    1 SVD分解介绍 之前用特征值来进行对角化的时候,被对角化的矩阵一定要是方阵,但是SVD的话,非方阵也是可以的. 矩阵Σ对角线上的元素都是大于等于0的 我们可以改变U,V的一些行和列,来达到Σ对角线 ...

  3. 机器学习笔记(二)矩阵和线性代数 例:用Python实现SVD分解进行图片压缩

    线性代数基本只要是理工科,都是必修的一门课.当时学习的时候总是有一个疑惑,这个东西到底是干嘛用的?为什么数学家发明出这么一套方法呢,感觉除了解方程没发现有什么大用啊!但随着学习的深入,慢慢发现矩阵的应 ...

  4. 【机器学习中的矩阵分解】LU分解、QR分解、SVD分解

    学习总结 文章目录 学习总结 一.三角分解(LU分解) 1.1 高斯消元 1.2 LU分解原理 1.3 LU分解python代码 1.4 LU分解算法 二.QR分解 2.1 Schmid 正交化 2. ...

  5. Python—SVD分解压缩图片

    奇异值分解压缩图片 对任意的A∈Crm×n有SVD分解,A=U(ΣOOO)VH其中U,V为酉矩阵,U=(u1,..,um)∈Cmm×mVH=(v1T..vnT)∈Cnn×nΣ=diag(σ1,..,σ ...

  6. SVD分解——潜在语义分析LSA(I)——概率性潜在语义分析PLSA(I)

    SVD分解 正交矩阵:若一个方阵其行与列皆为正交的单位向量,则该矩阵为正交矩阵,且该矩阵的转置和其逆相等.两个向量正交的意思是两个向量的内积为 0. 正定矩阵:如果对于所有的非零实系数向量 z z z ...

  7. 奇异值SVD分解的应用探究

    SVD分解的应用探究 一.特征值分解(EVD) 1.特征值 2.特征值分解过程 二.奇异值分解(SVD) 1.奇异值分解的形式 2.奇异值分解的方法 3.奇异值分解的价值 三.SVD分解在图像处理中的 ...

  8. 图像SVD分解与重构

    图像SVD分解与重构 将图像看成一个二维矩阵,三个通道的彩色图像就是3个二维矩阵,对矩阵分别进行svd分解.svd分解是将一个矩阵A写成U∗Σ∗VTU*\Sigma*V^TU∗Σ∗VT的形式,U和V都 ...

  9. 从投影的角度理解 SVD 分解

    前言 SVD分解是一种特别有意思的降维手段,它在降维的同时还可以发现某些潜在的隐向量,这些向量对于数据之间的潜在关系有很大的帮助. 下面我们使用一个例子来逐步导出SVD的近似分解,理解如何通过SVD来 ...

最新文章

  1. Visual C++ 控制栏
  2. 06复杂查询(多数据库表)
  3. python 就业需求分析_python的就业前景如何?
  4. php如何操作mysql数据库代码_php如何操作mysql数据库的类(附代码)
  5. 好好学习 天天编程—C语言之我的第一个hello world(二)
  6. 【以太坊源码】mpt实现
  7. 数据包的分类和调度-Linux TC的另一种解释
  8. Ubuntu中锐捷客户端的配置与使用
  9. 三菱plc编程有c语言吗,三菱plc编程用什么语言
  10. C6000 DSP技术深度探索(3)-中断向量表
  11. 开场PPT动画怎么做炫酷
  12. UVA - 10400 Game Show Math
  13. linux中分号转义字符,Linux职场技术篇-Linux shell中元字符、转义符、通配符的使用方法...
  14. android 更新相册,Android 图片存入系统相册更新显示实例详解
  15. 高考十年后,我成为一名高级研发工程师
  16. js总计_Excel总计前3名加上其他的总计
  17. 智慧工地安全施工实时监测系统解决方案
  18. 全球及中国胶粘剂和密封胶基材行业产销现状与运营前景预测报告2022版
  19. java提示系统找不到指定路径怎么解决?
  20. Raspbian命令行安装desktop界面

热门文章

  1. Maya arnold 前台渲染没反应
  2. 结合linux工具安装黑苹果小记
  3. 系统自学R的第十二天#参考书籍《R语言编程艺术》
  4. 【redis】cluster相关知识点整理
  5. 用Java输出百钱百鸡的方法及方法数量
  6. 灌区智能信息化管理系统解决方案
  7. BUUCTF-Misc-爱因斯坦
  8. 浪潮集团姜振华:智慧城市运营 引领城市可持续发展
  9. 从用途上区分自攻螺钉与钻尾螺钉
  10. 【详细】web项目集成百度商桥步骤 简单修改默认样式 咨询栏可收起与展开