• 转载:矩阵的秩


    在知乎上看到这个讲解,感觉很深刻。

    首先,讲到矩阵的秩,几乎必然要引入矩阵的SVD分解:X=USV',U,V正交阵,S是对角阵。如果是完全SVD分解的话,那S对角线上非零元的个数就是这个矩阵的秩了(这些对角线元素叫做奇异值),还有些零元,这些零元对秩没有贡献。

    有了这个前提,我们就可以用各种姿势来看秩了:

    1.把矩阵当做样本集合,每一行(或每一列,这个无所谓)是一个样本,那么矩阵的秩就是这些样本所张成的线性子空间维数。如果矩阵秩远小于样本维数(即矩阵列数),那么这些样本相当于只生活在外围空间中的一个低维子空间,这样就能实施降维操作。举个例子,同一个人在不同光照下采得的正脸图像,假设每一张都是192x168的,且采集了50张,那构成的数据矩阵就为50行192x168列的,但是如果你做SVD分解就会发现,大概只有前10个奇异值比较大,其他的奇异值都接近零,因此实际上可以将接近零的奇异值所对应的那些维度丢掉,只保留前10个奇异值对应的子空间,从而将数据降维到10维的子空间了。

    2.把矩阵当做一个映射,既然是映射,那就得考虑它作用在向量x上的效果Ax。注意Ax相当于A的列的某个线性组合,如果矩阵是低秩的,这意味着这些列所张成的空间是外围空间的一个低维子空间,这个空间由Ax表达(其中x任意)。换句话说,这个矩阵把R^n空间映射到R^m空间,但是其映射的像只在R^m空间的一个低维子空间内生活。从SVD理解的话,Ax=USV'x,因此有三个变换:第一是V'x,相当于在原始的R^n空间旋转了一下坐标轴,这样只是坐标的变化,不改变向量本身(例如长度不变);第二是S(V'x),这相当于沿着各个坐标轴做拉伸,并且如果S的对角线上某些元素为零,那么这些元素所对应的那些坐标轴就相当于直接丢掉了;最后再U(SV'x),还是一个坐标轴旋转。总的来看,Ax就相当于把一个向量x沿着某些特定的方向做不同程度的拉伸(附带上一些不关乎本质的旋转),甚至丢弃,那些没被丢弃的方向个数就是秩了。

    这样就有很多很直接的应用。例如考虑第一个意义。给定一堆数据,这些数据可能本身只是在一个低维子空间内生活(即可以用一个低秩矩阵表示),但是由于噪声存在,我们拿到这些数据时它们看起来像是外围空间中的点,没有任何可以降维的迹象(即矩阵是满秩的)。设我们拿到的数据是X,那么根据这个设定,X应该能分解为一个低秩矩阵L和一个噪声矩阵E的叠加,即X=L+E。现在问题是如何恢复出L,因为一旦找到L,就相当于去除了噪声,同时降低了数据的复杂度(即维度)。怎么恢复?可以通过求解min rank(L)+|E|_F^2, subject to X=L+E来恢复出L和E。秩就显式地被用在这个问题里了。当然,这个问题往往只是引子,无数论文在写出类似问题后不到三行就会把rank(L)换成|L|_*,这个就是另外一些故事了。。。

    按我的经验,跟秩有关的问题以及几何意义,只需要仔细分析矩阵的SVD分解就能解决。但很可惜,大学里的线性代数更喜欢去介绍SVD的兄弟——特征值分解,而这个兄弟又往往只偏好对称阵,不像SVD这样所有实矩阵都可以分析,导致处理一般矩阵的秩时没有一个趁手的工具。
  • 相关阅读:
    NET C#测试程序运行时间
    openGL 高程配色绘制点云(csGL)
    openGL 绘制文本font(csGL)
    openGL 选择和反馈(csGL)
    简单实现angular2组件双向绑定
    angular2 ChangeDetectorRef (变化检测器的引用)手动控制组件的变化检测行为
    Angular 2 Forward Reference (可用作获取父组件对象)
    两个iframe之间tab切换,谷歌浏览器的滚动条会消失
    js随机从数组中取出几个元素
    原生js javascript 实现trigger(自动触发window 的resize事件)
  • 原文地址:https://www.cnblogs.com/txq157/p/6610740.html
Copyright © 2020-2023  润新知