如今有线性系统: Ax = b, 解方程web
很容易获得解为: x1 = -100, x2 = -200. 若是在样本采集时存在一个微小的偏差,好比,将 A 矩阵的系数 400 改变成 401:google
则获得一个大相径庭的解: x1 = 40000, x2 = 79800.url
当解集 x 对 A 和 b 的系数高度敏感,那么这样的方程组就是病态的 (ill-conditioned).spa
那么,如何评价一个方程组是病态仍是非病态的呢?在此以前,须要了解矩阵和向量的 norm, 这里具体是计算很简单的 infinity norm, 即找行绝对值之和最大,举个例子:3d
infinity norm 具备三角性质:||x+y|| <=
||x|| + ||y||. 理解了这些概念,下面讨论一下衡量方程组病态程度的条件数,首先假设向量 b 受到扰动,致使解集 x 产生误差:code
即有:orm
同时,因为blog
综合上面两个不等式:ip
即获得最终的关系:get
若是是矩阵 A 产生偏差,一样能够获得:
其中, 条件数定义为:
通常来讲,方程组解集的精度大概是 个十进制的位的偏差。 好比,IEEE 标准表示的双精度浮点数的有效位是 16 位,若是条件数是 1e+10, 那么获得的结果中只有 6 位是精确的。因此,只有当方程组是良态时,残差 R = Ax - b 才能准确指示解的精度。
本身的见解:
线性系统 Ax = b 为何会病态?归根究竟是因为 A 矩阵列向量线性相关性过大,表示的特征太过于类似以致于容易混淆所产生的。举个例子, 现有一个两个十分类似的列向量组成的矩阵 A:
在二维空间上,这两个列向量夹角很是小。假设第一次检测获得数据 b = [1000, 0]^T, 这个点正好在第一个列向量所在的直线上,解集是 [1, 0]^T。如今再次检测,因为有轻微的偏差,获得的检测数据是 b = [1000, 0.001], 这个点正好在第二个列向量所在的直线上,解集是 [0, 1]^T。两次求获得了差异迥异的的解集。
假设 A 的两个单位特征向量是 x1, x2, 根据特征向量的性质:
上述矩阵 A 的特征值和特征向量分别为:
对于平面上的某一个向量 b,能够分解为两个特征向量的线性组合:
若是 远远大于
, 当 b 点在 x1 方向发生移动, m 值改变, 解集 x 变化不明显, 反之, 若是在 x2 方向移动, n 值改变,解集 x 变化很是大 !能够看到,特征值对解集起到了一个 scaling 的做用。反过来讲,若是一个特征值比其它特征值在数量级上小不少,x在对应特征向量 (x2) 方向上很大的移动才能产生b微小的变化.
2. 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
真正的自由是创建在规范的基础上的。病态矩阵解集的不稳定性是因为解集空间包含了自由度过大的方向,解决这个问题的关键就是将这些方向去掉,而保留 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。
参考资料: