机器学习基础:奇异值分解(SVD)
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)的更多相关文章
- [机器学习笔记]奇异值分解SVD简介及其在推荐系统中的简单应用
本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统. 1.SVD详解 SVD(singular value d ...
- 机器学习之-奇异值分解(SVD)原理详解及推导
转载 http://blog.csdn.net/zhongkejingwang/article/details/43053513 在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充 ...
- 机器学习实战(Machine Learning in Action)学习笔记————10.奇异值分解(SVD)原理、基于协同过滤的推荐引擎、数据降维
关键字:SVD.奇异值分解.降维.基于协同过滤的推荐引擎作者:米仓山下时间:2018-11-3机器学习实战(Machine Learning in Action,@author: Peter Harr ...
- 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射
机器学习降维方法概括 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...
- 算法工程师<机器学习基础>
<机器学习基础> 逻辑回归,SVM,决策树 1.逻辑回归和SVM的区别是什么?各适用于解决什么问题? https://www.zhihu.com/question/24904422 2.L ...
- 矩阵奇异值分解(SVD)及其应用
机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用(好文) [简化数据]奇异值分解(SVD) <数学之美> 第15章 矩阵运算和文本处理中的两个分类问题
- 一步步教你轻松学奇异值分解SVD降维算法
一步步教你轻松学奇异值分解SVD降维算法 (白宁超 2018年10月24日09:04:56 ) 摘要:奇异值分解(singular value decomposition)是线性代数中一种重要的矩阵分 ...
- 数学基础系列(六)----特征值分解和奇异值分解(SVD)
一.介绍 特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中.而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景. 奇异值分解是一个有着很明显的物理意义的一种方法,它可 ...
- 【疑难杂症】奇异值分解(SVD)原理与在降维中的应用
前言 在项目实战的特征工程中遇到了采用SVD进行降维,具体SVD是什么,怎么用,原理是什么都没有细说,因此特开一篇,记录下SVD的学习笔记 参考:刘建平老师博客 https://www.cnblogs ...
- Coursera 机器学习课程 机器学习基础:案例研究 证书
完成了课程1 机器学习基础:案例研究 贴个证书,继续努力完成后续的课程:
随机推荐
- 6月4日 python学习总结 初次接触jQuery
1. jQuery是什么?是一个轻量级的,兼容多浏览器的JS库(write less, do more) 1. 是一个工具,简单方便的实现一些DOM操作 2. 不用jQuery完全可以,但是不明智. ...
- python 模块和包的基础知识
1.常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀 2.为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理.这时我们不仅 ...
- 面试问题之C++语言:mutable关键字
转载于:https://www.cnblogs.com/xkfz007/articles/2419540.html mutable关键字 mutable的中文意思是"可变的,易变的" ...
- 面试问题之计算机网络:OSI七层网络模型及相关协议
一.应用层 功能:为应用程序提供服务并规定应用程序中通信相关的细节: 包括的协议如下: 1.超文本传输协议HTTP:这是一种基本的客户机/服务器的访问协议:浏览器向服务器发送请求,而服务器会应相应的网 ...
- 客户端注册 Watcher 实现 ?
1.调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象 2.标记请求 request,封装 Watcher 到 WatchRegistrati ...
- MySQL 里记录货币用什么字段类型?
NUMERIC 和 DECIMAL 类型被 MySQL 实现为同样的类型,这在 SQL92 标准允 许.他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数 据.当声明一个类是这些类型之 ...
- Spring Data Jpa使用QueryDsl接口出现的一些问题
1.QuerydslPredicateExecutor当实现此接口时,如果出现什么什么类没有找到的时候,请确认相关的querydsl依赖是否已经添加到maven依赖中 <dependency&g ...
- memcached 是原子的吗?
所有的被发送到 memcached 的单个命令是完全原子的.如果您针对同一份数据 同时发送了一个 set 命令和一个 get 命令,它们不会影响对方.它们将被串行化. 先后执行.即使在多线程模式,所有 ...
- 会话缓存(Session Cache)?
最常用的一种使用 Redis 的情景是会话缓存(session cache).用 Redis 缓存会 话比其他存储(如 Memcached)的优势在于:Redis 提供持久化.当维护一个不 是严格要求 ...
- 数据分析之Pandas操作
Pandas pandas需要导入 import pandas as pd from pandas import Series,DataFrame import numpy as np 1 Serie ...