一基本知识

  A是一个m*n的矩阵,那么A的SVD分解为\(A_{mn} = U_{mm}\Sigma _{mn}V^T_{nn}\),其中\(U^TU = I\),\(V^TV = I\),UV的列向量是矩阵\(A^TA\)的特征向量,V的列向量是矩阵\(AA^T\)的特征向量,\(\Sigma\)只在对角线上有非零元素,称为A的奇异值(Singular value),并按照降序排列,并且值为\(A^TA\)的特征值的算术平方根。SVD的分解不唯一。

  我们知道实对称阵必正交相似于对角矩阵。这里假设有这样的svd分解。

  则\(A^TA = V\Sigma^TU^TU\Sigma{V^T} = V\Sigma^T \Sigma{V^T}\) 即实对称矩阵,对角相似。V的列向量即特征向量。

  同理\(AA^T = U\Sigma V^TV\Sigma^TU^T = U\Sigma \Sigma^TU^T\),U的列向量为特征向量。

  由于对角化过程中选取特征值的不同,以及特征向量的正交化的过程,所以SVD的分解也是不唯一的。

  因为不可能所有的矩阵都是n阶方阵,所以对于一般性的矩阵,用SVD分解具有通用性。

二SVD的应用

  特征值评估了每个分量对综合的贡献。在SVD中,大多数情况下,前10%的奇异值占了全部奇异值之和的99%以上,我们可以取前r个分量近似描述举证。\(A_{mn} \approx U_{mr}\Sigma _{rr}V^T_{rn}\),从而可以把矩阵稀疏表示,减少存储的空间。可以用来图像降噪常认为小的特征值是噪声,所以取前r个分量可以达到降噪的效果。也可以用于图像的压缩,保留较大的特征值。

1.图像压缩

# -*- coding: utf-8 -*-
"""
Created on 2016/8/25
@author: zephyr
"""
from PIL import Image
import numpy as np def restore(sigma , u, v, k):
m = len(u)
n = len(v)
a = np.zeros((m,n))
for i in range(k+1):
ui = u[:,i].reshape(m,1)
vi = v[i].reshape(1,n)
a = a + sigma[i]*np.dot(ui,vi)
a[a < 0] = 0
a[a > 255] = 255
return np.rint(a).astype("uint8") if __name__ == "__main__":
A = Image.open('svdgun.jpg',"r")
a = np.array(A)
for k in range(100):
u, sigma, v = np.linalg.svd(a[:,:, 0])
R = restore(sigma,u,v,k)
u, sigma, v = np.linalg.svd(a[:,:, 1])
G = restore(sigma, u, v, k)
u, sigma, v = np.linalg.svd(a[:,:, 2])
B = restore(sigma, u, v, k)
I = np.stack((R,G,B),2)
Image.fromarray(I).save("svd_"+str(k)+".jpg")

如图所示分别是取特征值1,2,5,27的时候图片压缩之后的效果,取到27的时候已经和原图基本差不多了。

2.SVD与PCA 

  PCA是数据降维的方法,PCA方法是对矩阵\(X_{np}\)进行线性变换,映射到一组新的特征\(T_{np}\)上,满足\(X_{np} = T_{np}W_{pp}\)并且在特征T中协方差按照从大到小的顺序排列。本质上是一基的变化,使得变化后的数据有着最大的方差,方差用来描述稳定性,模型越稳定越好,方差小好,对于数据来说,大的方差才能发现其中各自的特性,比如数据都一样,也就没有意义。

  PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量。

  不妨用SVD来做PCA。

  根据SVD,有\(X_{np} = U_{nn}\Sigma_{np}V^T_{pp}\)。

  \(X^TX\)是对协方差的一个估计,也就是为什么我们做PCA的时候要使数据中心化,因为中心化之后,协方差矩阵与这里的\(X^TX\)只相差系数\(\frac{1}{n}\)。

  从而有\(X^TX = V{\Sigma^2}V^T = W^TT^2W \),如果\(W = V^T\),那么\(T^TT\)等于\(\Sigma^T\Sigma\)一样是从大到小排列。T也即所求。

  所以有\(X_{np} = \Sigma_{np}V_{pp}^T\),求PCA,可以通过SVD分解求解。PCA可以说是对SVD的一个包装。

  求PCA,可以先SVD分解,然后两边同右乘\(V\)或同左乘\(U^T\),可以分别进行列和行的压缩提取。上面说的是右乘\(V\)得\(X_{np}\),也可以类似的得到\(X_{pn}\)。不像\(X^TX\)求特征值,特征向量只能求得一个方向。

参考:http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html

奇异值分解 SVD的更多相关文章

  1. 矩阵奇异值分解(SVD)及其应用

    机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用(好文) [简化数据]奇异值分解(SVD) <数学之美> 第15章 矩阵运算和文本处理中的两个分类问题

  2. 转载:奇异值分解(SVD) --- 线性变换几何意义(下)

    本文转载自他人: PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理 ...

  3. 特征值分解与奇异值分解(SVD)

    1.使用QR分解获取特征值和特征向量 将矩阵A进行QR分解,得到正规正交矩阵Q与上三角形矩阵R.由上可知Ak为相似矩阵,当k增加时,Ak收敛到上三角矩阵,特征值为对角项. 2.奇异值分解(SVD) 其 ...

  4. 奇异值分解(SVD) --- 几何意义

    原文:http://blog.sciencenet.cn/blog-696950-699432.html PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD ...

  5. [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用

    本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统. 1.SVD详解 SVD(singular value d ...

  6. 【转载】奇异值分解(SVD)计算过程示例

    原文链接:奇异值分解(SVD)的计算方法 奇异值分解是线性代数中一种重要的矩阵分解方法,这篇文章通过一个具体的例子来说明如何对一个矩阵A进行奇异值分解. 首先,对于一个m*n的矩阵,如果存在正交矩阵U ...

  7. 一步步教你轻松学奇异值分解SVD降维算法

    一步步教你轻松学奇异值分解SVD降维算法 (白宁超 2018年10月24日09:04:56 ) 摘要:奇异值分解(singular value decomposition)是线性代数中一种重要的矩阵分 ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维

    关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...

  9. 用 GSL 求解超定方程组及矩阵的奇异值分解(SVD)

    用 GSL 求解超定方程组及矩阵的奇异值分解(SVD) 最近在学习高动态图像(HDR)合成的算法,其中需要求解一个超定方程组,因此花了点时间研究了一下如何用 GSL 来解决这个问题. GSL 里是有最 ...

  10. 奇异值分解(SVD)原理详解及推导(转载)

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有 ...

随机推荐

  1. String类

    字符串的功能          A:判断功能                  boolean equals(Object obj)//比较对象                  boolean eq ...

  2. Mybatis常用总结:参数,返回,执行sql,include等

    1.参数注入1.1用#{0},#{1}的形式,0代表第一个参数,1代表第二个参数 public List<RecordVo> queryList(String workerId, Inte ...

  3. Atitit Atitit.软件兼容性原理----------API兼容 Qa7

    Atitit Atitit.软件兼容性原理----------API兼容 Qa7 1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法 ...

  4. JavaWeb之XML详解

    XML语言 什么是XML? XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML.它被设计的宗旨是传输数据,而非显示数据. XML标签没有 ...

  5. getting started with transformjs

    Introduction In the past two years, more and more friends for mobile web development have used the t ...

  6. iOS NSDate等时间类的使用

    一.NSDate NSDate对象用来表示一个具体的时间点. NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体. NSDate存储的是GMT时间,使用的时候会根据 ...

  7. hideSoftInputFromWindow

    有的时候会碰到软键盘不好关闭,然后就去调界面代码,发现不行,说到底还是对软键盘不熟悉的原因,软键盘windowSoftInputMode有很多种 如果你默认的activity的模式为默认的,或者sta ...

  8. swift 学习笔记[1]

    最近在IMOOK(网站)上自学了下swift , 总结下swift相对其他语言的不同之处 , 方便熟悉其他语言的程序员,熟悉swift语言的特性. 1. swift 的特别之处就是可以在原有的类上 , ...

  9. iOS开发中的数学函数

    在iOS开发当中...我们往往会涉及到一些算法...为了节省一些时间...让APP很快地被开发出来...我们需要对各类函数有一定的了解...接下来...我把部分常用函数分享出来...希望能帮到大家.. ...

  10. APP级别处理未捕获异常

    前言: 项目APP有时候会出现Crash,然后就是弹出系统强制退出的对话框,点击关闭APP. 有的APP进行了处理,会发现,当程序出现异常的时候,会Toast一个提示"程序出现异常,3秒后将 ...