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

矩阵分解

特征向量和特征值

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

定义:设A∈Fn×nA∈Fn×n是n阶方阵。如果存在非零向量X∈Fn×1X∈Fn×1使AX=λXAX=λX对某个常数λ∈Fλ∈F成立,则称λλ是A的特征值(eigenvalue),X是属于特征值λλ的特征向量。
设σσ是数域F上向量空间V上的线性变换,如果某个非零向量u∈Vu∈V被σσ映射到自己的常数倍σ(u)=λuσ(u)=λu,则称常数λ∈Fλ∈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   10  -1  -20   0   3> eig(A1)
ans =3-13

也就是说,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−1A=Vdiag(λ)V−1
按照上面公式方法对矩阵A所做的操作叫做A的特征分解(eigen decomposition)

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

奇异值分解

对于多数方阵,我们可以进行特征值分解。如果对于非方阵该怎么办呢?答案是我们有类似的奇异向量(Singular vector)和奇异值(singular value). 通过奇异向量和奇异值,我们可以把非方阵进行奇异值分解(singular value decomposition),简称svd. 
SVD将矩阵分解为三个矩阵的乘积:A=UDVTA=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)−1ATA+=limα→0(ATA+αI)−1AT

这个定义在计算时是没法使用的,我们使用另一个公式来算
A+=VD+UTA+=VD+UT

这个公式一看太熟悉了,就是刚才我们学习的奇异值分解嘛。
其中D+D+,D的广义逆的计算方法是所有非0值取倒数,然后矩阵转置。

对于一个AX=B方程组的最小二乘法解,一般来讲不是唯一的。通常把它们中2-范数最小的一个称为极小最小二乘解,也叫最佳逼近解。
可以证明,AX=B必有唯一的极小最小二乘解,这个解就是X=A+BX=A+B

广义逆简史

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

  1. 必须是方阵
  2. 行列式不能为0

美国数学家Moore于1920年逆矩阵的概念推广到任意矩阵上,使用的方法是正交投影算子来定义的。
1955年,英国数学家Penrose用下面的方程组来定义广义逆:
AGA=A,GAG=G,(AG)H=AG(GA)H=GAAGA=A,GAG=G,(AG)H=AG(GA)H=GA
其中,H这个符号代表矩阵共轭的转置,对于实数就相当于T。
不久之后,瑞典大地测量学家Arne Bjerhammer证明了Moore广义逆与Penrose广义逆的等价性。所以把它定义为Moore-Penrose广义逆。除了A+A+之外,还有A−

A−广义逆等。

作者:lusing

原文链接

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

Tensorflow快餐教程(6) - 矩阵分解相关推荐

  1. tf 如何进行svd_Tensorflow快餐教程(6) - 矩阵分解

    摘要: 特征分解,奇异值分解,Moore-Penrose广义逆 矩阵分解 特征向量和特征值 我们在<线性代数>课学过方阵的特征向量和特征值. 定义:设A∈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. Tensorflow快餐教程(8) - 深度学习简史

    深度学习简史 从机器学习流派说起 如果要给机器学习划分流派的话,初步划分可以分为『归纳学习』和『统计学习』两大类.所谓『归纳学习』,就跟我们平时学习所用的归纳法差不多,也叫『从样例中学习』. 归纳学习 ...

  7. Tensorflow快餐教程(9) - 卷积

    摘要: 卷积的计算方法 卷积 卷积就是滑动中提取特征的过程 在数学中,卷积convolution是一种函数的定义.它是通过两个函数f和g生成第三个函数的一种数学算子,表征函数f与g经过翻转和平移的重叠 ...

  8. Tensorflow快餐教程(3) - 向量

    向量 向量在编程语言中就是最常用的一维数组. 二维数组叫做矩阵,三维以上叫做张量. 向量虽然简单,高效,且容易理解.但是与操作0维的标量数据毕竟还是不同的.比如向量经常用于表示一个序列,生成序列像标量 ...

  9. Tensorflow快餐教程(7) - 梯度下降

    梯度下降 学习完基础知识和矩阵运算之后,我们再回头看下第一节讲的线性回归的代码: import tensorflow as tf import numpy as nptrX = np.linspace ...

最新文章

  1. 冲出UAC-解决Win UAC问题的编程经验
  2. GlusterFS常用命令小结
  3. hyperopt中文文档:Installation-Notes安装说明
  4. Spring-Cloud组件:eureka
  5. vba 自动换行_Excel中quot;强制换行quot;quot;快速求和quot;等操作,这9个AlT键技巧全都包含了...
  6. mocha.js 生成覆盖率报告
  7. 正常人一天步行走路多少为宜
  8. UDP穿越NAT原理(p2p)
  9. C# BackgroundWorker组件学习
  10. 微信云支付so seay
  11. qca9563修改art区,将2T2R修改为1T1R
  12. SoundHound:根据哼唱的旋律找到你想要的歌曲
  13. 实验1前篇——BIOS编程空间
  14. 错误:1 error and 0 warnings potentially fixable with the `--fix` option. 报错问题解决方法
  15. 复旦大学计算机学院教师简介,复旦大学计算机科学技术学院导师教师师资介绍简介-危辉...
  16. 一种典型的手机APP远程控制PLC解决方案
  17. U盘安装ubuntu20.04并优化
  18. 茅台酒养成记:质量是对消费者最长久而衷心的承诺
  19. 关于mysql注入说法正确的是_1. 在 Spring中,下列关于 依赖注入 的 说法 , 正确的是( ) 。_学小易找答案...
  20. Android Socket IQ聊天软件 之 聊天气泡编码步骤讲解

热门文章

  1. 实用必备xp框架模块_Xposed框架安装、使用以及插件开发
  2. 【LeetCode笔记】53. 最大子序和(Java、动态规划)
  3. python123数值运算_python123中 Hello World的条件输出 和数值运算
  4. 手机相机里面的m_荣耀V30 PRO详细评测:Matrix Camera相机矩阵开启5G视频时代
  5. updatebyprimarykeyselective返回什么是成功_嫦娥五号发射升空成功!!!
  6. 微信时代计算机教学,互联网+时代技工院校计算机教学方式研究
  7. c#+mysql图片存数据库_C#图片存入数据库及其读出显示
  8. 各类木材强度_凯狄解析各类抽芯铆钉的工作原理
  9. 与context的关系_你还不知道 OpenGL ES 和 EGL 的关系?
  10. c语言中数据存储在文件中,急求如何将下列C语言程序数据存储到文件中?