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

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

矩阵分解

特征向量和特征值

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

定义:设AFn×nA∈Fn×n是n阶方阵。如果存在非零向量XFn×1X∈Fn×1使AX=λXAX=λX对某个常数λFλ∈F成立,则称λλ是A的特征值(eigenvalue),X是属于特征值λλ的特征向量。
σσ是数域F上向量空间V上的线性变换,如果某个非零向量uVu∈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(λ)V1A=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

原文链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521799.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZTree的全选 反选 全不选 取消 清空

全选 //全选$(#c_all).on(click,function (e) {var zTree $.fn.zTree.getZTreeObj("treeMenu");//得到tree对象 treeMenu是我的treeidvar node zTree.getNodes();//得到全部节点var nodes zTree.transformToArray(node);//全部节点转换成数组arrayvar checkNode …

对数周期天线hfss建模_HFSS也有金手指,FADDM招式详解

FADDM(Finite Array Domain Decomposition Method)即有限大阵区域分解法是HFSS针对周期阵列天线的一种高效仿真方法,这种方法不仅能提升天线阵列建模和求解的效率,还能保证仿真结果的精准度。FADDM的优势同样的硬件可求解更大规模的阵列与在HFSS全模型求解具有同样精…

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

摘要: 梯度下降梯度下降学习完基础知识和矩阵运算之后,我们再回头看下第一节讲的线性回归的代码:import tensorflow as tf import numpy as nptrX np.linspace(-1, 1, 101) trY 2 * trX np.random.randn(*trX.shape) * 0.33 # 创建一些线性…

php网页执行流程,PHP程序的执行流程

PHP程序的执行流程为了以后能开发PHP扩展,就一定要了解PHP的执行顺序。这篇文章就是为C开发PHP扩展做铺垫。Web环境我们假设为Apache。在编译PHP的时候,为了能够让Apache支持PHP,我们会生成一个mod_php5.so的模块。Apache加载这个模块,在url访…

腾讯物联网操作系统正式开源,最小体积仅1.8 KB

9月18日,腾讯宣布将开源自主研发的轻量级物联网实时操作系统TencentOS tiny。相比市场上其它系统,腾讯TencentOS tiny在资源占用、设备成本、功耗管理以及安全稳定等层面极具竞争力。该系统的开源可大幅降低物联网应用开发成本,提升开发效率&…

云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍

摘要: 本文带大家简单理解阿里巴巴Java开发手册中的规约内容以及P3C项目,可以帮助开发者扫描出所有潜在的代码隐患。在中间也聊了一些对于不同语言设计的理解,如何去看待语言的设计,其实是我们去学习一个语言的核心。演讲嘉宾简介…

你的数据安全么?Hadoop再曝安全漏洞| 黑客利用Hadoop Yarn资源管理系统未授权访问漏洞进行攻击

摘要: 4月30日,阿里云发现,俄罗斯黑客利用Hadoop Yarn资源管理系统REST API未授权访问漏洞进行攻击。 Hadoop是一款由Apache基金会推出的分布式系统框架,它通过著名的 MapReduce 算法进行分布式处理,Yarn是Hadoop集群的…

linux建立软连接

格式命令ln -s 源文件的绝对路径 目标文件的绝对路径ln -s /opt/libreoffice6.3/program/soffice /usr/bin/soffice需求把soffice 和/usr/bin/soffice 建立软连接现在执行命令/opt/libreoffice6.3/program/soffice --headless --invisible --convert-to pdf 3.19m.doc建立软连接…

博文强识|进阶企业大咖

出品 | CSDN云计算 每个周三周五,和小编共同分享优秀博文,一起遨游在知识的海洋。 你需要知道的那些 redis 数据结构(前篇) redis 对于团队中的同学们来说是非常熟悉的存在了,我们常用它来做缓存、或是实现分布式锁等…

php 类似微信下拉菜单,微信小程序模拟下拉菜单开发实例

本文主要和大家分享微信小程序模拟下拉菜单开发实例,希望能帮助到大家。一.知识点1.实现动态显示和隐藏某个控件列表1data:{open:false},showitem:function(){this.setData({open:!this.data.open})},.display_show{display: block;}.display_none{display: none;}2…

算法导论 pdf_学习数据结构和算法最好的书是什么?

-----------通知:如果本站对你学习算法有帮助,请收藏网址,并推荐给你的朋友。由于 labuladong 的算法套路太火,很多人直接拿我的 GitHub 文章去开付费专栏,价格还不便宜。我这免费写给你看,多宣传原创作者是…

Tensorflow快餐教程(8) - 深度学习简史

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

usb设备驱动程序(一)

代码&#xff1a; #include <linux/atomic.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/usb.h> #include <linux/videodev2.h> #include <linux…

linux 动态传参执行shell脚本

举个栗子&#xff1a; 我想执行的命令如下 /usr/bin/soffice --headless --invisible --convert-to pdf 3.doc但是这样命令就写死了&#xff0c;如何动态传参数&#xff0c;执行shell脚本呢&#xff1f; 步骤释义说明执行命令①创建一个2.sh的文件vim 2.sh②把通用的命令复制…

Tensorflow快餐教程(9) - 卷积

摘要&#xff1a; 卷积的计算方法卷积卷积就是滑动中提取特征的过程在数学中&#xff0c;卷积convolution是一种函数的定义。它是通过两个函数f和g生成第三个函数的一种数学算子&#xff0c;表征函数f与g经过翻转和平移的重叠部分的面积。其定义为&#xff1a;h(x)f(x)∗g(x)∫…

php websocket 连接已断开连接,客户端websocket 无法连接上PHP socket问题

我客户端是用c写得websocket客户端我请求的地址是ws://127.0.0.1:100322 (我请求ws://echo.websocket.org这个是可以的说明客户端代码是没问题的 问题就在服务端)输出[1405476678:7805] NOTICE: Initial logging level 7[1405476678:7806] NOTICE: Library version: 1.3 1544a2…

商家笑了 设计师哭了,京东+英特尔的AI这招太绝

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 刘丹出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;在如今“无促销不电商”的大环境熏陶下&#xff0c;商家需要榨干了脑浆想尽各种奇招&#xff0c;玩法虽多&#xff0c;但万变不离其宗。面对上万、甚至…

明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...

类型别名(type alias)一个名字&#xff0c;是某种类型的同义词。使用类型名有很多好处&#xff0c;能让复杂的类型名字变得简单明了&#xff0c;易于理解和使用。有两种方法可用于定义类型别名。传统的方法是使用关键字typedef :typedef double wages; //wages是double的同义词…

基于OGG Datahub插件将Oracle数据同步上云

摘要&#xff1a;随着数据规模的不断扩大&#xff0c;传统的RDBMS难以满足OLAP的需求&#xff0c;本文将介绍如何将Oracle的数据实时同步到阿里云的大数据处理平台当中&#xff0c;并利用大数据工具对数据进行分析。一、背景介绍随着数据规模的不断扩大&#xff0c;传统的RDBMS…

java执行linux脚本 并返回其执行结果

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List;/*** 执行脚本的工具类*/ public class ExecutionScriptUtils {public static List<Stri…