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. YCCMS 3.3 CSRF漏洞--代码执行

    一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.点击新建项目按钮,弹出对画框中选择(C:\ ...

  2. redis实战课题

    redis实战课题 本课题主要围绕用户登录时,直接到redis中查找用户的登录信息,密码验证.重置密码.查询所有用户.显示登录次数最多的前3位,最后通过(C# SQL)持久化到SQL Server 数 ...

  3. SVPWM实现概述

    SVPWM是FOC的基础,其实现流程大致如下所示: 1. 判断合成矢量所在扇区 2. 计算相邻矢量作用时间 3. 计算各桥臂导通时间 4. 得到各相PWM占空比 5. 更新相应寄存器值  SVPWM目 ...

  4. CentOS6跟CentOS7的区别

    1.CentOS6在/etc/profile配置环境变量是JAVAHOME,CentOS7是{JAVA_HOME} 2.

  5. 随意写文件命令?怎么向屏幕输出带空格的字符串,比如”hello world”?

    写文件命令:vi 向屏幕输出带空格的字符串:echo hello world

  6. react单向数据流怎么理解?

    React是单向数据流,数据主要从父节点传递到子节点(通过props).如果顶层(父级)的某个props改变了,React会重渲染所有的子节点.

  7. 使用redis作为django缓存数据库

    1.Redis的Windows版本.打开https://github.com/MSOpenTech/redis/releases下载msi安装包.该版本是64位.安装msi过程中,有个选项是否加入系统 ...

  8. synchronized的原理

    synchronized的使用 synchronized是一个java中的关键字,是基于JVM层面的,用于保证java的多线程安全,它具有四大特性,可用于完全替代volatile: 原子性:所谓原子性 ...

  9. 9_根轨迹_Part3_分离点/汇合点和根的性质

  10. layui表单使用开关滑块和复选框,渲染后台数据方法

    提示:整个表格要在form标签内 定义开关模板 <div class="layui-form" lay-filter="layuiadmin-app-form-li ...