Maths | 病态问题和条件数
目录
在CV领域大部分问题都是非适定问题(ill-posed problem)。
对于这个“非适定”这一概念,我一直没有探究过。这次看到一篇非常精彩的博客,在这里分享给大家,建议大家查看原文~这里只作笔记,对原文中的错误略有修改。
1. 概念定义
1.1. 病态/ 良态问题
病态问题(ill-conditioned problem):问题的解关于条件非常敏感。条件(或数据)中即使存在极微妙的噪声,也会对问题的解造成剧烈的变化。
反之,关于条件不敏感的问题,我们称之为良态问题(well-conditioned problem)。
显然,我们能把这两个概念拓展至病态/ 良态系统(算法),“条件”即系统的输入,“问题的解”即系统的输出。
举一些例子:
- 人体体温调控系统是良态的,因为体表温度微小的变化也只会带来微小的体温调控;
- 汽车动力系统是良态的,因为微踩油门时,汽车动力也只会稍作改变。
再延伸至机器学习算法:
- 如果一个算法对噪声非常敏感,即病态的,那么其健壮性(robustness)也不佳(健壮性就是说系统抗扰动的能力)。
- 如果一个算法是过拟合的,那么该算法一定是病态的。
1.2. 适定/ 非适定问题
适定问题(ill-posed problem)的定义来源于1903年哈达玛(Hadamard)的演讲:一个问题是适定的,当其满足以下3个条件:
- 解存在;
- 解是唯一的;
- 解连续依赖于输入(解随着初始条件的改变而连续改变)(The solution depends continuously on the input)。
只要不满足其中一个条件,那么该问题就是非适定的(ill-posed)。
注意:(非)适定问题既可以是良态的,也可以是病态的。
1.3. 良态/ 病态矩阵和条件数
设有线性方程组\(\mathbf{A} \vec{x} = \vec{b}\),其中\(\mathbf{A}\)是\(n \times n\)方阵,\(\vec{x}\)和\(\vec{b}\)都是\(n \times 1\)列向量。
假设条件\(\vec{x}\)变化了\(\Delta{\vec{x}}\),解相应地变化了\(\Delta{\vec{b}}\),即:
\[
\mathbf{A} (\vec{x} + \Delta{\vec{x}}) = \vec{b} + \Delta{\vec{b}}
\]
由于\(\mathbf{A} \vec{x} = \vec{b}\),因此有\(\mathbf{A} \Delta{\vec{x}} = \Delta{\vec{b}}\)。
假设\(\mathbf{A}\)是非奇异矩阵,即\(\mathbf{A}\)为方阵且存在逆矩阵\(\mathbf{A^{-1}}\),那么有:
\[
\Delta{\vec{x}} = \mathbf{A^{-1}} \cdot \Delta{\vec{b}}
\]
两边取范数,根据范数的特性有:
\[
\Vert \Delta{\vec{x}} \Vert = \Vert \mathbf{A^{-1}} \cdot \Delta{\vec{b}} \Vert \le \Vert \mathbf{A^{-1}} \Vert \cdot \Vert \Delta{\vec{b}} \Vert
\tag{1-1}\]
对\(\mathbf{A} \vec{x} = \vec{b}\)有相同的操作:
\[
\Vert \mathbf{A} \vec{x} \Vert = \Vert \vec{b} \Vert \le \Vert \mathbf{A} \Vert \cdot \Vert \vec{x} \Vert
\tag{1-2}\]
结合(1-1)、(1-2)式有:
\[
\frac{\Vert \Delta \vec{x} \Vert}{\Vert \vec{x} \Vert} \le \Vert \mathbf{A} \Vert \cdot \Vert \mathbf{A^{-1}} \Vert \cdot \frac{\Vert \Delta \vec{b} \Vert}{\Vert \vec{b} \Vert}
\tag{1-3}\]
有东西!
- \(\frac{\Vert \Delta \vec{x} \Vert}{\Vert \vec{x} \Vert}\)是初始条件的变化率;
- \(\frac{\Vert \Delta \vec{b} \Vert}{\Vert \vec{b} \Vert}\)是解的变化率;
虽然是不等号,但系数\(\Vert \mathbf{A} \Vert \cdot \Vert \mathbf{A^{-1}} \Vert\)还是有意义的。我们称之为矩阵\(\mathbf{A}\)的条件数(condition number),表示为:
\[
k(\mathbf{A}) = \Vert \mathbf{A} \Vert \cdot \Vert \mathbf{A^{-1}} \Vert
\]
式中的范数可以是0范数,无穷范数等,要注意矩阵\(\mathbf{A}\)必须是非奇异矩阵。
由(1-3)可得:
- 当条件数\(k(\mathbf{A})\)较小时,若初始条件发生较小变化,则解的变化也不大;此时的矩阵\(\mathbf{A}\)就是良态矩阵;
- 当条件数\(k(\mathbf{A})\)较大时,即使初始条件发生较小变化,解的变化也会很大;此时的矩阵\(\mathbf{A}\)就是病态矩阵。
因此,条件数是用来衡量系统敏感度的指标,可用于判定病态/ 良态矩阵。
回到前面的注,显然,病态/ 良态的概念与非适定/ 适定的概念是不一致的。
条件数不小于1:
\[
k(\mathbf{A}) = \Vert \mathbf{A} \Vert \cdot \Vert \mathbf{A^{-1}} \Vert \ge \Vert \mathbf{A} \mathbf{A^{-1}} \Vert = \Vert \mathbf{I} \Vert = 1
\]
2. 病态的根源
病态矩阵的较大条件数,并非其病态的根本原因。其根源在于矩阵列向量相关性过强。
病态矩阵,实际上是奇异矩阵和近奇异矩阵的另一个说法。
我们举个例子:
\[
\mathbf{W} = \begin{bmatrix}
1333 & -131 \\
331 & -31 \\
\end{bmatrix},\ \vec{x} = \begin{bmatrix}
1 \\
11 \\
\end{bmatrix}
\]
解为:
\[
\vec{y} = \begin{bmatrix}
-120 \\
-13 \\
\end{bmatrix}
\]
如果我们对输入条件作微调,则结果会变为:
\[
\begin{cases}
\begin{split}
\vec{x_1} &= \begin{bmatrix}
1.0097 \\
11.001 \\
\end{bmatrix} \Longrightarrow \vec{y_1} &= \begin{bmatrix}
-95.2 \\
-6.82 \\
\end{bmatrix} \\
\vec{x_2} &= \begin{bmatrix}
1.0024 \\
11.010 \\
\end{bmatrix} \Longrightarrow \vec y_2 &= \begin{bmatrix}
-106.11 \\
-9.52 \\
\end{bmatrix}
\end{split}
\end{cases}
\]
可见,解变化的程度远远大于输入条件变化的程度。并且,矩阵\(\mathbf{A}\)的列向量之间相关性极强。
3. 计算条件数的方法
虽然我们有条件数的定义,但当矩阵为病态矩阵时,其中的求逆结果往往会有很大误差。因此通常情况下,我们会使用矩阵的特征值或奇异值来计算条件数。
3.1. 与特征值的关系
特征值较大者,变化自由度高,因此会导致解的剧烈变化。这有点类似于病态矩阵的表现。
参见:一篇博文
3.2. 与奇异值的关系
通过SVD分解,解的不稳定性也能用矩阵的性质加以解释。参见:一篇博文
3.3. 自由数计算方法
若我们取二范数,则条件数为矩阵\(\mathbf{A}\)的最大、最小奇异值之商:
\[
k(\mathbf{A}) = \frac{\sigma_{max}{\mathbf{A}}}{\sigma_{min}{\mathbf{A}}}
\]
正规阵条件数
当矩阵\(\mathbf{A}\)为正规阵时,条件数为矩阵\(\mathbf{A}\)的最大、最小特征值的绝对值之商:
\[
k(\mathbf{A}) = \frac{\vert \lambda_{max}{\mathbf{A}} \vert}{\vert \lambda_{min}{\mathbf{A}} \vert}
\]
酉矩阵条件数
当矩阵\(\mathbf{A}\)为酉矩阵时,条件数为1:
\[
k(\mathbf{A}) = 1
\]
即当且仅当\(\mathbf{A}\)为酉矩阵时,条件数取得最小值1。
奇异矩阵条件数
当\(\mathbf{A}\)为奇异矩阵时,其逆矩阵不存在:
\[
k(\mathbf{A}) \to \infty
\]
4. 解释机器学习中的鲁棒性
假设我们要用SGD,用一批\((X,Y)\)样本训练线性模型:
\[
\mathbf{W} \cdot \mathbf{X} = \mathbf{Y}
\]
变形:
\[
\underbrace{\mathbf{X}}_{A} \cdot \underbrace{\mathbf{Y}^{-1}}_{\vec{x}} = \underbrace{\mathbf{W}^{-1}}_{\vec{b}}
\]
由上面所学的知识,若样本\(\mathbf{X}\)中存在大量相关(相似)样本,或矩阵\(\mathbf{X}\)是病态的,那么当标签\(\mathbf{Y}\)中存在噪声时,会导致解\(\mathbf{W}\)出现剧烈波动!
而在实际情况中,我们很难避免数据噪声。因此我们会对样本进行一些预处理,如异常点检测和离群点检测,目的都是为了获得良态的数据矩阵。
5. 病态矩阵规避:正则化(Regularizaiton)
当样本数远小于特征向量维度时,损失函数表示的矩阵往往是稀疏甚至是病态的。
此时我们可以加入正则化项。
正则化项会增加数值解与真实解之间的误差,但增强了稳定性。
参考资料
Maths | 病态问题和条件数的更多相关文章
- 机器学习中的矩阵方法(附录A): 病态矩阵与条件数
1. 病态系统 现在有线性系统: Ax = b, 解方程 很容易得到解为: x1 = -100, x2 = -200. 如果在样本采集时存在一个微小的误差,比如,将 A 矩阵的系数 400 改变成 4 ...
- NDT(Normal Distributions Transform)算法原理与公式推导
正态分布变换(NDT)算法是一个配准算法,它应用于三维点的统计模型,使用标准最优化技术来确定两个点云间的最优的匹配,因为其在配准过程中不利用对应点的特征计算和匹配,所以时间比其他方法快.下面的公式推导 ...
- Note | 常用指令,工具,教程和经验笔记
目录 图像处理 机器学习和数学 编程环境和工具 写作工具 其他 图像处理 获取图像频域并分解为高低频:https://www.cnblogs.com/RyanXing/p/11630493.html ...
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...
- 开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
原文:[原创]开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p ...
- 什么是Condition Number(条件数)?
In the field of numerical analysis, the condition number of a function with respect to an argument m ...
- 条件数(condition number)
首先引入维基上的解释 In the field of numerical analysis, the condition number of a function with respect to an ...
- CF456B Fedya and Maths 找规律
http://codeforces.com/contest/456/problem/B CF#260 div2 B Fedya and Maths Codeforces Round #260 B. F ...
- BZOJ 3665: maths
Sol 矩阵乘法+快速幂+欧拉定理. 首先观察题目可以发现 \(A_n\) 可以表示成关于 \(K\) 和 \(A_0\) 的几次幂的形式. \(A_0\) 就比较简单了 \(m^n\) 所以第一部分 ...
随机推荐
- Mysql的隔离级别
一.首先什么是事务? 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消.也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做. 事 ...
- conda 常用命令
conda search --full --name python conda update -n base conda //update最新版本的conda conda create -n xxxx ...
- ES中的分词器
基本概念: 全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokenizer(分词器), 这些Token会被进一步处理, 比如转成小写等, 这 ...
- C#使用File.Create()创建文件后资源被占用
由于文件被占用不能读写,所以报错“另一个程序正在使用此文件进程无法访问” 解决方法是在创建文件后立即Dispose掉 File.Create(path).Dispose();
- IDEA查看项目对应的git地址
参考 https://blog.csdn.net/yyyadan/article/details/85091972 项目文件夹/.git/config
- Swift UITableView嵌套UICollectionView点击事件冲突(点击事件穿透)
不管是啥都响应tableviewcell class JYShopCertificationCell: UITableViewCell { override func hitTest(_ point: ...
- docker与虚拟机的区别
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- 关于项目里server清楚缓存的代码
Venk proc存在很多问题,不能应对高并发的情况,所以提供了这个 方法来清理cache, 但是前提是需要有prod的权限: 要想验证是否通过URL清楚了缓存,就要 removeCache url执 ...
- 递归,re,time,random
递归函数 1.在函数中调用自己 2.超过递归的最大深度报错,递归的最大深度:998大概 3.递归的缺点:占内存 4.优点:代码简单 import sys sys.setrecursionlimit(2 ...
- common skill
lunix watch and kill progress 1. ps -ef 2. kill -9 pid