摘要: 特征分解,奇异值分解,Moore-Penrose广义逆

矩阵分解

特征向量和特征值

我们在《线性代数》课学过方阵的特征向量和特征值。

定义:设A∈Fn×n是n阶方阵。如果存在非零向量X∈Fn×1使AX=λX对某个常数λ∈F成立,则称λ是A的特征值(eigenvalue),X是属于特征值λ的特征向量。

设σ是数域F上向量空间V上的线性变换,如果某个非零向量u∈V被σ映射到自己的常数倍σ(u)=λu,则称常数λ∈F是σ的特征值,向量u是属于特征值λ的特征向量。

又找λ又找A确实不是一件容易事。好在,我们可以把这事儿交给Tensorflow去解决。我们可以用tf.self_adjoint_eigvals来求特征值,相当于MATLAB的eig函数,只不过名字长了点。

例:

>>> A1 = tf.constant([[3,2,1],[0,-1,-2],[0,0,3]],dtype=tf.float64)

>>> sess.run(A1)

array([[ 3., 2., 1.],

[ 0., -1., -2.],

[ 0., 0., 3.]])

>>> sess.run(tf.self_adjoint_eigvals(A1))

array([-1., 3., 3.])

附:MATLAB例:

> A1 = [3,2,1;0,-1,-2;0,0,3]

A1 =

3 2 1

0 -1 -2

0 0 3

> eig(A1)

ans =

3

-1

3

也就是说,A1矩阵有3个特征值-1,3,3。

特征分解

我们把用self_adjoint_eigvals求出来的向量转换成对角矩阵:

>>> sess.run(tf.diag(tf.self_adjoint_eigvals(A1)))

array([[-1., 0., 0.],

[ 0., 3., 0.],

[ 0., 0., 3.]])

同样,我们把每个特征向量组成一个矩阵,假设为V.

这样,我们可以得到一个公式:A=Vdiag(λ)V−1

按照上面公式方法对矩阵A所做的操作叫做A的特征分解(eigen decomposition)

不是每一个矩阵都可以分解成特征值和特征向量。在某些情况下,特征分解存在,但是值是复数而不是实数。幸运的是,机器学习中遇到的方阵基本都可以分解成A=QΛQT,其中Q是特征向量构成的正交矩阵,Λ是对角矩阵。

奇异值分解

对于多数方阵,我们可以进行特征值分解。如果对于非方阵该怎么办呢?答案是我们有类似的奇异向量(Singular vector)和奇异值(singular value). 通过奇异向量和奇异值,我们可以把非方阵进行奇异值分解(singular value decomposition),简称svd.

SVD将矩阵分解为三个矩阵的乘积:A=UDVT。其中,U和V都定义为正交矩阵。D是对角矩阵,虽然不一定是方阵。

如果A是一个mn的矩阵,那么U是一个mm的矩阵,V是一个nn的矩阵,D与A一样是mn的矩阵。

我们可以通过tf.svd函数来做奇异值分解,例:

>>> As =tf.constant( [[1,2,3],[4,5,6]], dtype=tf.float64)

>>> sess.run(As)

array([[1., 2., 3.],

[4., 5., 6.]])

>>> sess.run(tf.svd(As, full_matrices=True))

(array([9.508032 , 0.77286964]), array([[-0.3863177 , -0.92236578],

[-0.92236578, 0.3863177 ]]), array([[-0.42866713, 0.80596391, 0.40824829],

[-0.56630692, 0.11238241, -0.81649658],

[-0.7039467 , -0.58119908, 0.40824829]]))

As矩阵是23的矩阵。所以U是22的,而V是3*3的。第1个值是奇异值,[9.508032 , 0.77286964],它是D的对角线上值,其它位置为0.

D的完整值为:

array([[9.508032 , 0. , 0. ],

[0. , 0.77286964, 0. ]])

三个矩阵的完整值为:

#U

array([[-0.3863177 , -0.92236578],

[-0.92236578, 0.3863177 ]])

#D

array([[9.508032 , 0. , 0. ],

[0. , 0.77286964, 0. ]])

#V

array([[-0.42866713, 0.80596391, 0.40824829],

[-0.56630692, 0.11238241, -0.81649658],

[-0.7039467 , -0.58119908, 0.40824829]])

我们来验算一下这个奇异值分解是不是正确的,别忘了V是要转置的:

>>> sess.run(U @ D @ tf.transpose(V))

array([[0.99999997, 1.99999999, 2.99999997],

[3.99999997, 5.00000001, 5.99999996]])

虽然是有点浮点计算误差,但是结果还确实是我们分解前的那个。关于计算误差的问题,在机器学习中也自然是重要问题,后面会讨论。

Moore-Penrose广义逆

铺垫了这么多,其实我们是在为解线性方程组奋斗。我们在第一节Tensorflow的线性回归例子,还有神经网络的例子都看到,求解线性方程组是重要的运算。

形如Ax=b的线性方程组,如果A有逆矩阵就好办了,两边分别右乘A逆就可以解出方程组。

但是问题是,机器学习中有很多方程是欠定的(underdetermined)。

这时候我们就需要一种类似于逆矩阵的工具 - Moore-Penrose广义逆(pseudoinverse)。

Moore-Penrose广义逆定义如下:

A+=limα→0(ATA+αI)−1AT

这个定义在计算时是没法使用的,我们使用另一个公式来算

A+=VD+UT

这个公式一看太熟悉了,就是刚才我们学习的奇异值分解嘛。

其中D+,D的广义逆的计算方法是所有非0值取倒数,然后矩阵转置。

对于一个AX=B方程组的最小二乘法解,一般来讲不是唯一的。通常把它们中2-范数最小的一个称为极小最小二乘解,也叫最佳逼近解。

可以证明,AX=B必有唯一的极小最小二乘解,这个解就是X=A+B

广义逆简史

首先复习一下逆阵的概念,如果一个矩阵有逆阵,条件为:

必须是方阵

行列式不能为0

美国数学家Moore于1920年逆矩阵的概念推广到任意矩阵上,使用的方法是正交投影算子来定义的。

1955年,英国数学家Penrose用下面的方程组来定义广义逆:

AGA=A,GAG=G,(AG)H=AG(GA)H=GA

其中,H这个符号代表矩阵共轭的转置,对于实数就相当于T。

不久之后,瑞典大地测量学家Arne Bjerhammer证明了Moore广义逆与Penrose广义逆的等价性。所以把它定义为Moore-Penrose广义逆。除了A+之外,还有A−广义逆等。

作者:lusing

本文为云栖社区原创内容,未经允许不得转载。

tf 如何进行svd_Tensorflow快餐教程(6) - 矩阵分解相关推荐

  1. Tensorflow快餐教程(6) - 矩阵分解

    摘要: 特征分解,奇异值分解,Moore-Penrose广义逆 矩阵分解 特征向量和特征值 我们在<线性代数>课学过方阵的特征向量和特征值. 定义:设A∈Fn×nA∈Fn×n是n阶方阵.如 ...

  2. Tensorflow快餐教程(4) - 矩阵

    摘要: Tensorflow矩阵基础运算 矩阵 矩阵的初始化 矩阵因为元素更多,所以初始化函数更多了.光靠tf.linspace,tf.range之类的线性生成函数已经不够用了. 可以通过先生成一个线 ...

  3. Tensorflow快餐教程(12) - 用机器写莎士比亚的戏剧

    高层框架:TFLearn和Keras 上一节我们学习了Tensorflow的高层API封装,可以通过简单的几步就生成一个DNN分类器来解决MNIST手写识别问题. 尽管Tensorflow也在不断推进 ...

  4. Tensorflow快餐教程(1) - 30行代码搞定手写识别

    摘要: Tensorflow入门教程1 去年买了几本讲tensorflow的书,结果今年看的时候发现有些样例代码所用的API已经过时了.看来自己维护一个保持更新的Tensorflow的教程还是有意义的 ...

  5. Tensorflow快餐教程(5) - 范数

    矩阵进阶 - 范数 作为快餐教程,我们尽可能多上代码,多介绍工具,少讲原理和公式.但是我也深知这样是无法讲清楚的,毕竟问题的复杂度摆在这里呢.与大家一起在Tensorflow探索一圈之后,我一定要写一 ...

  6. PyTorch快餐教程2019 (1) - 从Transformer说起

    PyTorch快餐教程2019 (1) - 从Transformer说起 深度学习已经从热门技能向必备技能方向发展.然而,技术发展的道路并不是直线上升的,并不是说掌握了全连接网络.卷积网络和循环神经网 ...

  7. PyTorch快餐教程2019 (2) - Multi-Head Attention

    PyTorch快餐教程2019 (2) - Multi-Head Attention 上一节我们为了让一个完整的语言模型跑起来,可能给大家带来的学习负担过重了.没关系,我们这一节开始来还上节没讲清楚的 ...

  8. 推荐系统系列教程之十五:一网打尽协同过滤、矩阵分解和线性模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十四期,今天按约推出第十五期:一网打尽协同过滤.矩阵分解和线性模型.希望朋友们多点"在看",多多转发,我 ...

  9. 代码补全快餐教程(1) - 30行代码见证奇迹

    代码补全快餐教程(1) - 30行代码见证奇迹 下面是我用30多行代码,包含了很多空行和注释的代码写成的代码补全模型.我们先看看效果吧. 补全效果案例 先来看个比较普通的(Python, Keras) ...

最新文章

  1. Spring Security OAuth笔记
  2. centos安装anaconda_每天三分钟之TensorFlow学习03:Win下安装TF2
  3. Queue+Stack(C++,标准库中的队列和栈)
  4. 使用API获得SAP CRM Sales Area数据
  5. php 小程序自定义图,微信小程序之如何使用自定义组件封装原生 image 组件
  6. AndroidStudio_Build Out窗口显示乱码解决方案---Android原生开发工作笔记222
  7. mysql 测试 缓存_mysql 缓存开启及测试
  8. Django 进阶篇之 CSRF,COOIKE,SESSION
  9. Julia: 亿元估值AI网红代码的不同版本(readline与replace的用法)
  10. c 语言与试验系统,Turbo C/C++软件学习下载
  11. 雷达多普勒频率计算公式_现代战争的千里眼,顺风耳——雷达
  12. FPGA信号处理系列文章——卷积编码与维特比译码
  13. 网络ip段计算,网络地址计算,广播地址计算,主机号计算规则
  14. 中国图形图象学报和计算机科学,《中国图象图形学报》编辑部
  15. nat64 dns64 linux 内核支持,搭建NAT64/DNS6实现IPv4/v6转换
  16. springboot美容院会员管理系统毕业设计源码191740
  17. 【网络安全】网络安全期末大题 复习题
  18. 3000商家挤进云栖小镇,抢滩阿里速卖通平台
  19. python掷骰子猜大小
  20. 无线射频芯片CC2540F256RHAR 中文资料介绍

热门文章

  1. axis2 wsdl2java 使用方式
  2. fabric canvas 清空并重置画布
  3. dd命令iso linux_BootISO:从 ISO 文件中创建一个可启动的 USB 设备
  4. 【APICloud系列|4】APP设计统一图标大小的方法
  5. roads 构筑极致用户体验_坚持用户思维 推动领克汽车逆势突围
  6. java中菜单分几级_JavaWeb三级菜单分类查询详解
  7. 计算机演示题打不开,大神为你演示win7系统计算机上右键管理打不开的还原技巧...
  8. php怎么把字符转成大写,php怎么把字符串转换为大写
  9. 参考文献中会议名称怎么缩写_期刊缩写查询总结
  10. js中字符串和数组的使用