SVD 原理

奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,也是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。

有一个×的实数矩阵,我们想要把它分解成如下的形式:$A = U\Sigma V^T$

其中和均为单位正交阵,即有$=$和$=$,称为左奇异矩阵,称为右奇异矩阵,Σ仅在主对角线上有值,我们称它为奇异值,其它元素均为0。

上面矩阵的维度分别为$U \in R^{m\times m}$,$\ \Sigma \in R^{m\times n}$,$\ V \in R^{n\times n}$。

一般地Σ有如下形式

$$

\Sigma =

\left[

\begin{matrix}

\sigma_1 & 0 & 0 & 0 & 0\

0 & \sigma_2 & 0 & 0 & 0\

0 & 0 & \ddots & 0 & 0\

0 & 0 & 0 & \ddots & 0\

\end{matrix}

\right]_{m\times n}

$$

$_$ 越大意味着对应的 $′$ 的特征值 $\sigma_j^2$ 越大, 从而其主成分 (principal component) $_$ 的样本方差越大, 我们把方差大视为提供了更多信息.

求解U, Σ, V

假设我们的矩阵A是一个m×n的矩阵,则$A^TA$是方阵,求其特征值及特征向量:

$(A^TA)v_i = \lambda_i v_i$

得到矩阵$A^TA$的n个特征值和对应的n个特征向量$v$



$ATA=V\SigmaTU^TU\Sigma V^T$ =$V\Sigma^T\Sigma V^T= V\Sigma2VT$

将特征向量$v$张成一个$n×n$的矩阵$V$,就是SVD公式里面的$V$矩阵,$V$中的每个特征向量叫做$A$的右奇异向量。

同理:$(AA^T)u_i = \lambda_i u_i$,可得$U$矩阵。

求得$U , V$,然后求Σ,因Σ为奇异值矩阵,所以只需要求出每个奇异值$σ$即可。

$A=U\Sigma V^T \Rightarrow AV=U\Sigma V^TV \Rightarrow $

$AV=U\Sigma \Rightarrow Av_i = \sigma_i u_i \Rightarrow \sigma_i=Av_i / u_i$

其实特征值矩阵等于奇异值矩阵的平方,也就是说特征值和奇异值满足如下关系:

$\sigma_i = \sqrt{\lambda_i}$

所以不用$\sigma_i = Av_i / u_i$也可以通过求出$A^TA$的特征值取平方根来求奇异值。

SVD算法


输入:样本数据

输出:左奇异矩阵,奇异值矩阵,右奇异矩阵

1 计算特征值: 特征值分解$AA^T$,其中$A \in \mathbf{R}^{m\times n}$为原始样本数据

$AA^T=U\Sigma \SigmaTUT$

得到左奇异矩阵$U \in \mathbf{R}^{m \times m}$和奇异值矩阵$\Sigma' \in \mathbf{R}^{m \times m}$

2 间接求部分右奇异矩阵: 求$V' \in \mathbf{R}^{m \times n}$

利用A=UΣ′V′可得

$V' = (U\Sigma')^{-1}A = (\Sigma'){-1}UTA$

3 返回U, Σ′, V′,分别为左奇异矩阵,奇异值矩阵,右奇异矩阵。


Python 求解SVD

from numpy import array
from numpy import diag
from numpy import zeros
from scipy.linalg import svd
# define a matrix
A = array([
[1,2,3,4,5,6,7,8,9,10],
[11,12,13,14,15,16,17,18,19,20],
[21,22,23,24,25,26,27,28,29,30]])
print(A)
>>> A
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
[21, 22, 23, 24, 25, 26, 27, 28, 29, 30]])
# Singular-value decomposition
U, s, VT = svd(A)
# create m x n Sigma matrix
Sigma = zeros((A.shape[0], A.shape[1]))
# populate Sigma with n x n diagonal matrix
Sigma[:A.shape[0], :A.shape[0]] = diag(s)
# select
n_elements = 2
Sigma = Sigma[:, :n_elements]
VT = VT[:n_elements, :]
# reconstruct
B = U.dot(Sigma.dot(VT))
print(B)
>>> B
array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.],
[11., 12., 13., 14., 15., 16., 17., 18., 19., 20.],
[21., 22., 23., 24., 25., 26., 27., 28., 29., 30.]])
# transform
T = U.dot(Sigma)
print(T)
>>> T
array([[-18.52157747, 6.47697214],
[-49.81310011, 1.91182038],
[-81.10462276, -2.65333138]])
T = A.dot(VT.T)
print(T)
[[-18.52157747   6.47697214]
[-49.81310011 1.91182038]
[-81.10462276 -2.65333138]]

参考:

https://www.cnblogs.com/pinard/p/6251584.html

https://www.cnblogs.com/endlesscoding/p/10033527.html

机器学习基础:奇异值分解(SVD)的更多相关文章

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

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

  2. 机器学习之-奇异值分解(SVD)原理详解及推导

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

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

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

  4. 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射

    机器学习降维方法概括   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...

  5. 算法工程师<机器学习基础>

    <机器学习基础> 逻辑回归,SVM,决策树 1.逻辑回归和SVM的区别是什么?各适用于解决什么问题? https://www.zhihu.com/question/24904422 2.L ...

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

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

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

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

  8. 数学基础系列(六)----特征值分解和奇异值分解(SVD)

    一.介绍 特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景. 奇异值分解是一个有着很明显的物理意义的一种方法,它可 ...

  9. 【疑难杂症】奇异值分解(SVD)原理与在降维中的应用

    前言 在项目实战的特征工程中遇到了采用SVD进行降维,具体SVD是什么,怎么用,原理是什么都没有细说,因此特开一篇,记录下SVD的学习笔记 参考:刘建平老师博客 https://www.cnblogs ...

  10. Coursera 机器学习课程 机器学习基础:案例研究 证书

    完成了课程1  机器学习基础:案例研究 贴个证书,继续努力完成后续的课程:

随机推荐

  1. iscsi挂载

                                                                         iscsi挂载 1.server端:   (1) yum -y ...

  2. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

  3. S120的基本定位功能

    转自:https://support.industry.siemens.com/cs/document/84136148/s120%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%AE%9 ...

  4. [MRCTF]XOR-无法生成反汇编的处理

    主程序,无法生成伪代码 由此分为两种方法即: 直接看反汇编 解决问题,尝试生成伪代码 硬啃汇编 输入与输出 判断输入长度是否为0x1B,其中al为eax的低8位 将输入的字符每个与当前字符所在下标异或 ...

  5. Future和FutureTask的区别

    java中有Future和FutureTask这两个类 Future是一个接口,代表可以取消的任务,并可以获得任务的执行结果 FutureTask 是基本的实现了Future和runnable接口  ...

  6. Java如何跳出当前的多重嵌套循环?

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环.例如, outer: for(int i=0;i<1 ...

  7. C# 操作ie网页,注入JavaScript等操作

    之前做过一个录制鼠标键盘并回放的功能,使用的关键技术是钩子程序.在实现针对指定页面进行录制的过程中,发现C#操作网页的功能. https://www.cnblogs.com/wangchuang/ar ...

  8. SpringCloud和Dubbo?

    SpringCloud和Dubbo都是现在主流的微服务架构SpringCloud是Apache旗下的Spring体系下的微服务解决方案Dubbo是阿里系的分布式服务治理框架从技术维度上,其实Sprin ...

  9. Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?

    1.ZooKeeper保证的是CP,Eureka保证的是AP ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka各个节点是平等关系,只要有一台Eureka ...

  10. MySQL 根据JSON类型的字段进行过滤数据的方式

    第一种方式:JSON_CONTAINS 函数 : 执行相等形式的比较 注意:值的类型一定要相同,不然会报错 文档地址:https://dev.mysql.com/doc/refman/8.0/en/j ...