奇异值分解 SVD
一基本知识
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的更多相关文章
- 矩阵奇异值分解(SVD)及其应用
机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用(好文) [简化数据]奇异值分解(SVD) <数学之美> 第15章 矩阵运算和文本处理中的两个分类问题
- 转载:奇异值分解(SVD) --- 线性变换几何意义(下)
本文转载自他人: PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD的几何意义.能在有限的篇幅把这个问题讲解的如此清晰,实属不易.原文举了一个简单的图像处理 ...
- 特征值分解与奇异值分解(SVD)
1.使用QR分解获取特征值和特征向量 将矩阵A进行QR分解,得到正规正交矩阵Q与上三角形矩阵R.由上可知Ak为相似矩阵,当k增加时,Ak收敛到上三角矩阵,特征值为对角项. 2.奇异值分解(SVD) 其 ...
- 奇异值分解(SVD) --- 几何意义
原文:http://blog.sciencenet.cn/blog-696950-699432.html PS:一直以来对SVD分解似懂非懂,此文为译文,原文以细致的分析+大量的可视化图形演示了SVD ...
- [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用
本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统. 1.SVD详解 SVD(singular value d ...
- 【转载】奇异值分解(SVD)计算过程示例
原文链接:奇异值分解(SVD)的计算方法 奇异值分解是线性代数中一种重要的矩阵分解方法,这篇文章通过一个具体的例子来说明如何对一个矩阵A进行奇异值分解. 首先,对于一个m*n的矩阵,如果存在正交矩阵U ...
- 一步步教你轻松学奇异值分解SVD降维算法
一步步教你轻松学奇异值分解SVD降维算法 (白宁超 2018年10月24日09:04:56 ) 摘要:奇异值分解(singular value decomposition)是线性代数中一种重要的矩阵分 ...
- 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维
关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...
- 用 GSL 求解超定方程组及矩阵的奇异值分解(SVD)
用 GSL 求解超定方程组及矩阵的奇异值分解(SVD) 最近在学习高动态图像(HDR)合成的算法,其中需要求解一个超定方程组,因此花了点时间研究了一下如何用 GSL 来解决这个问题. GSL 里是有最 ...
- 奇异值分解(SVD)原理详解及推导(转载)
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有 ...
随机推荐
- R语言:常用统计检验
统计检验是将抽样结果和抽样分布相对照而作出判断的工作.主要分5个步骤: 建立假设 求抽样分布 选择显著性水平和否定域 计算检验统计量 判定 -- 百度百科 假设检验(hypothesis test)亦 ...
- Maven远程仓库的认证
大部分远程仓库无须认证就可以访问,但有时处于安全方面的考虑,我们需要提供认证信息才能访问一些远程仓库.为了防止非法的仓库访问,管理员为每个仓库提供了一组用户名及密码. 这时,为了能让Maven访问仓库 ...
- C#中日期和时间相加的方法
可能对于初入此行业人来说有些困惑,实现起来有一丝复杂. 比如说时间是:2016-08-05 14:46:30,中间过了56秒钟.要求得出56秒之后的时间格式是:年月日时分秒 下面介绍最简单的办法, m ...
- win10 下visual studio 2015 在调试模式下不能跟踪源文件
win10 下visual studio 2015 在调试模式下不能跟踪源文件,只要一调试就会关闭(隐藏)打开的文档,非常不方便.经过一番折腾,发现是配置的问题. 如果安装多个版本的VS,请删除对应版 ...
- Linux Distribution / ROM
Linux发行版 http://unix.stackexchange.com/questions/87011/how-to-easily-build-your-own-linux-distro 这个文 ...
- 用AVFoundation自定义相机拍照
自定义拍照或者录视频的功能,就需要用到AVFoundation框架,目前我只用到了拍照,所以记录下自定义拍照用法,视频用法等用上了再补充,应该是大同小异 demo在这里:https://github. ...
- SSH面试题(struts2+Spring+hibernate)
struts2 + Spring +hibernate Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory ...
- EasyUI combobox
高度自适应 data-options="required:true,editable:false,panelHeight:'auto',panelMaxHeight:170" 加上 ...
- spool命令
最近工作中,需对数据进行比对.在此之前,则需将数据导出.想到以前用过的spool命令,实验一番,分享如下: 需建SQL执行脚本,内容如下: set feedback off --关掉行数显示set ...
- postgresql 导出数据字典文档
项目上需要整理目前数据库的数据字典文档.项目不规范,这种文档只要后期来补.这么多张表,每个字段都写到word文档里真心头大.就算前面写了个查询表结构的sql,但是最后整理到word里还是感觉有点麻烦. ...