矩阵论基础知识5(病态矩阵与条件数 )
病态矩阵与条件数
1. 病态系统
现在有线性系统: Ax = b, 解方程
很容易得到解为: x1 = -100, x2 = -200. 如果在样本采集时存在一个微小的误差,比如,将 A 矩阵的系数 400 改变成 401:
则得到一个截然不同的解: x1 = 40000, x2 = 79800.
当解集 x 对 A 和 b 的系数高度敏感,那么这样的方程组就是病态的 (ill-conditioned).
2. 条件数
那么,如何评价一个方程组是病态还是非病态的呢?在此之前,需要了解矩阵和向量的 norm, 这里具体是计算很简单的 infinity norm(无穷范数), 即找行元素绝对值之和最大的,举个例子:
infinity norm 具有三角性质:||x+y|| <=
||x|| + ||y||. 理解了这些概念,下面讨论一下衡量方程组病态程度的条件数,首先假设向量 b 受到扰动,导致解集 x 产生偏差:
即有:
同时,由于
综合上面两个不等式:
即得到最终的关系:
如果是矩阵 A 产生误差,同样可以得到:
其中, 条件数定义为:
一般来说,方程组解集的精度大概是 个十进制的位的误差。 比如,IEEE 标准表示的双精度浮点数的有效位是 16 位,如果条件数是 1e+10, 那么得到的结果中只有 6 位是精确的。所以,只有当方程组是良态时,残差 R = Ax - b 才能准确指示解的精度。
3. 病态的由来
自己的看法:
线性系统 Ax = b 为什么会病态?归根到底是由于 A 矩阵列向量线性相关性过大,表示的特征太过于相似以至于容易混淆所产生的。举个例子, 现有一个两个十分相似的列向量组成的矩阵 A:
在二维空间上,这两个列向量夹角非常小。假设第一次检测得到数据 b = [1000, 0]^T, 这个点正好在第一个列向量所在的直线上,解集是 [1, 0]^T。现在再次检测,由于有轻微的误差,得到的检测数据是 b = [1000, 0.001], 这个点正好在第二个列向量所在的直线上,解集是 [0, 1]^T。两次求得到了差别迥异的的解集。
4. 与特征值和 SVD 的关系
- 特征值
假设 A 的两个单位特征向量是 x1, x2, 根据特征向量的性质:
上述矩阵 A 的特征值和特征向量分别为:
对于平面上的某一个向量 b,可以分解为两个特征向量的线性组合:
把上式带入,
如果 远远大于 , 当 b 点在 x1 方向发生移动, m 值改变, 解集 x 变化不明显, 反之, 如果在 x2 方向移动, n 值改变,解集 x 变化非常大 !可以看到,特征值对解集起到了一个 scaling 的作用。反过来说,如果一个特征值比其它特征值在数量级上小很多,x在对应特征向量 (x2) 方向上很大的移动才能产生b微小的变化.
2. SVD
SVD 分解:
联系上次学到的 SVD 知识,将 A 分解成三个矩阵的乘积,中间的对角线矩阵也起到了 scaling 的作用。我们按照正向思维来考虑这个问题,现在来了一个解集 x 向量,左乘 A 矩阵等价与左乘 USV^T, x 向量正好等于 V^T 最后一行向量,经过 S 矩阵的 scaling 缩小之后对 b 的影响非常小。也就是说, 解集 x 在 V^T 最后一行的行向量方向自由度最大!自由度越大,越不稳定,极端情况是该方向奇异值为 0, 解集可以在该方向取任意值,这也正好对应了矩阵 A 有零特征值, Ax 在对应特征向量的方向上移动不改变 Ax 的值。
在不同的 norm 下,条件数又可以由最大奇异值与最小奇异值之间的比值,或者最大特征值和最小特征值之间比值的绝对值来表示,详情请参考维基百科
最后, A 的条件数究竟等于多少呢? cond(A) = 2e+06
5. 病态矩阵处理方法
真正的自由是建立在规范的基础上的。病态矩阵解集的不稳定性是由于解集空间包含了自由度过大的方向,解决这个问题的关键就是将这些方向去掉,而保留 scaling 较大的方向,从而把解集局限在一个较小的区域内。在上面的讨论中, A 矩阵的特征向量不一定正交,不适合做新基, SVD 分解正好分解出了正交基,可以选前 k 个 v^T 向量作为正交基。
比如,现在只选取前一个 (0.707, 0.707) 方向作为基,解集局限咋 y = x 这条直线上。直观的解释就是, A 矩阵的两个列向量过于类似,我们就可以将它们等同看待,第一次 b = (1000, 0), 解集是(0.5, 0.5), 第二次 b = (1000, 0.001), 解集还是 (0.5, 0.5).
总结起来,解决 A 病态就是将解集限定在一组正交基空间内,即对于坐标 y, 选择 k 个正交基 Zk,解决问题:
这个就是 reduce-rank model. 具体方法有 truncated SVD 和 Krylov subspace method。
矩阵论基础知识5(病态矩阵与条件数 )相关推荐
- 矩阵论基础知识4——强大的矩阵奇异值分解(SVD)及其应用
强大的矩阵奇异值分解(SVD)及其应用 版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如 ...
- 矩阵论基础知识——病态矩阵与条件数
1. 病态系统 现在有线性系统: Ax = b, 解方程 很容易得到解为: x1 = -100, x2 = -200. 如果在样本采集时存在一个微小的误差,比如,将 A 矩阵的系数 400 改变成 4 ...
- 矩阵论基础知识2(正交、 Givens 变换、Householder变换)
机器学习中的矩阵方法02:正交 说明:Matrix Methods in Data Mining and Pattern Recognition 读书笔记 1. 正交的一些概念和性质 在前一章的最小二 ...
- 矩阵论(零):线性代数基础知识整理(2)——矩阵的秩与向量组的秩
矩阵论专栏:专栏(文章按照顺序排序) 本篇博客承接上篇矩阵论(零):线性代数基础知识整理(1)--逆矩阵.初等变换.满秩分解,主要整理秩相关的结论. 线性方程组的解与向量组的秩 线性方程组的解(初步讨 ...
- 矩阵论(零):线性代数基础知识整理(1)——逆矩阵、(广义)初等变换、满秩分解
矩阵论专栏:专栏(文章按照顺序排序) 线性代数是矩阵论的先修课程,本篇博客整理线性代数的基础理论知识,为矩阵论的学习做准备.限于篇幅,梳理的重点将在定理和结论上(只给出部分必要的定义),对最基础的概念 ...
- 矩阵论(零):线性代数基础知识整理(5)——特征值与相似
矩阵论专栏:专栏(文章按照顺序排序) 本篇博客的上篇是矩阵论(零):线性代数基础知识整理(4)--线性空间与线性变换,梳理了线性空间与线性变换的相关内容.本文主要整理矩阵的特征值与相似的相关内容. 方 ...
- 2021-03-15 深入理解SLAM技术【1】 基础知识
1 啥是SLAM? SLAM是真正的3d技术,是解决移动车辆的定位和动态地图生成的问题的.比如说,你要构造一个自主机器人,能实现路面行走,障碍规避,而且理解三维透视场景,甚至将这种场景翻译成几何场景, ...
- 矩阵分析与应用(一)——矩阵基础知识、广义逆
文章目录 前言 部分符号约定 关于矩阵理论的碎碎念 一些基础知识与本门课知识串讲 矩阵奇异与线性无关 向量空间.内积.范数 行列式.特征值.迹 逆.广义逆 矩阵方程.向量化.Kronecker积 向量 ...
- 嵌入式Linux的OTA更新,基础知识和实现
嵌入式Linux的OTA更新,基础知识和实现 OTA updates for Embedded Linux, Fundamentals and implementation 更新的需要 一旦嵌入式Li ...
最新文章
- 比RNN快136倍!上交大提出SRNN,现在RNN也能做并行计算了
- python安装方法32位_【Python】pycharm安装32位win7出现的问题解决办法。
- mvn filter autoconfig 产生自动配置
- jbod ugood 磁盘驱动状态_如何检查Mac磁盘空间,mac磁盘空间其他怎么清理
- ActiveMQ入门实例
- 单例模式小记【原创】
- 基于阈值的损失函数_推荐 :常见损失函数和评价指标总结(附公式amp;代码)...
- 多台云服务器中Redis的主从复制
- Linux 下 Weblogic 的安装 、配置以及发布
- Java中的MD5加密
- 基于实时流的数据基础-分享
- Verilog语法概述(一)
- RPG游戏制作-01-搭建游戏框架,初进游戏世界
- sklearn之make_blobs:产生数据集
- Javascript 报错 Uncaught TypeError: x is not a function 常见错误总结
- 中小企业常遇到这些问题,看APS系统是如何解决的
- 国内外Unity视频学习网站大全
- CSS之盒子的边距塌陷(兄弟、父子)与解决方案
- 移动端软键盘弹起遮挡输入框问题的解决方案
- 什么是类比估算法=自上而下的估算
热门文章
- 前后台系统(一、前端js和后端fcgi通信 )
- 微信小程序0基础快速入门(史上最全!!!)
- java多功能计算器编程,java 编程 计算器 本人菜菜!!!
- 联想7400PRO清零
- MIDI文件深入剖析
- 英语计算机统考成绩多久出来,计算机二级考试成绩多久出来
- Web前端学习笔记11:JavaScript_注释_输入输出_变量_数据类型_关键字_保留字_运算符_流程控制
- Anaconda打开之后无法显示界面,再打开显示There is an instance of anaconda navigator already running
- PHP开发转账到支付宝账户功能
- jq使用face-api.js 识别人脸对比是否是同一个人