zoukankan      html  css  js  c++  java
  • 你不知道的SVD(Singular Value Decomposition)

    原文You Don’t Know SVD (Singular Value Decomposition)

    回想一下高中物理的矢量,例如 ,使用矢量表示的力可以被分解到 X 轴和 Y 轴上:

    恭喜你。现在你已经知道奇异值分解到底在表达什么了

    数学就是给相同概念分配不同名字的艺术,虽然 仅仅就是 SVD 将向量分解到正交的坐标轴上,但我们就想给它一个非常高大上的名字。

    我们来看一个例子。


    当一个向量 a 被分解,我们可以得到3条重要的信息:

    1. 投影的 方向 —— 单位向量(V1V2)代表朝哪个方向投影(分解)。在上图中,投影的方向是 X 轴和 Y 轴,另外投影的方向可以是任意的正交方向轴。
    2. 投影的 长度(线段 Sa1Sa2)—— 这些告诉我们向量在每一个投影的方向上包含了多少(由于 Sa1 > Sa2 ,所以向量 aV1"学习" 到的比在V2 上多)
    3. 投影 向量 (Pa1Pa2) —— 通过把它们加起来重构原始向量 a (向量的加法)。每一个投影向量都可以用投影方向和投影长度表示: Pa1=Sa1 ***** V1Pa2=Sa2 ***** V2 ,因此它们是多余的。

    下面给出重要的结论

    任何一个向量都可以用:

    1. 投影方向单位向量(V1V2 ……)
    2. 投影在单位方向上的长度( Sa1Sa2 ……)

    表示

    SVD所作的一切都是在将这个结论扩展到多个向量(点)和多个维度上:

    一个数据集的例子(一个点可以看成从原点到该点的向量)

    现在,正真的问题是如何如何分解这么多点。


    如何分解多个点

    要想知道如何分解多个点,就必须知道如何分解一个点!

    在数学上,我们通常都会使用矩阵来做这件事。

    所以使用矩阵来表示向量分解的操作

    这看起来非常自然:

    这和之前的图是一样的,只不过是旋转了投影坐标。这样做是为了让你相信投影坐标不只局限于 x 轴和 y 轴。(ax 和 ay 是向量 a 的坐标,依照惯例它们被放入了一个列矩阵(又叫列向量)。V1,V2 也是一样的

    我们想在单位向量V1V2上分解(投影)向量a

    你可能早就知道了投影是通过 点乘 完成的 —— 它给出了投影的长度(Sa1Sa2):

    (a)在V1和V2上的投影

    但是这有些冗余。我们可以优化这些矩阵……

    …将两个方程式写到一起,每多一个单位向量就多加一个额外的列

    我们甚至可以加入更多的点…

    …每多一个点就多加一行。S 是一个包含投影长度的矩阵

    当加入点 b 后,看起来像这样:

    现在就很容易扩展到任意数量的点和任意维度的情况:

    n=点的数量,d=维度数,A=包含点的矩阵,V=包含投影(分解)轴的矩阵,S=包含投影长度的矩阵

    这充分体现了数学的优雅。


    回顾一下:

    这里点乘就是普通的矩阵乘法

    完全可以换一个说法:

    由于V是由正交列组成的,他的逆等于转置(这是正交矩阵的性质)

    SVD所要表达的全部就是(别忘了前面所提到的重要结论):

    任何一组向量 (A) 都可以在某些正交轴 (V) 上以投影长度 (S) 表示。

    然而,我们还没有说明白。传统的SVD表达式是这样的:

    现在的问题就是要怎么实现:

    这也正是我们接下来要做的。


    如果你稍微仔细一点,你会发现矩阵 S 是像下面这样的组成:

    这表明我们最好标准化这些列向量(后面会说原因),例如把它们变成单位长度。

    这是通过将每个列向量除以它的大小来实现的,但是是以矩阵的形式来展示。


    首先用一个例子看看这个 “除法” 是如何实现的。

    我们想要用 2M 的第一列。为了保持等式,我们必须乘以另一个矩阵:

    我们可以很直观的想到这个未知的矩阵是一个 第一个元素被除数 2 替换的单位矩阵

    那么第二列除以3就是很直接的了,直接用3替换单位矩阵的第二个元素就可以了:

    很显然这些操作可以扩展到有任意尺寸的任何矩阵

    现在我们想把上面的除法应用到矩阵 S

    为了标准化 S 的列,我们除以它们的大小(摸):

    我们对 S 进行和 M 一样的处理:

    最终

    Singular Value Decomposition

    当然,为了不分散对核心概念的注意力,一些精细的细节和严谨的数学都被掩盖了。


    解释

    我们来讨论一下 UΣ

    σ是什么?为什么我们要自找麻烦的去标准化 S 来发现它们呢?

    我们已经看到(σi)是 所有点,投影在第 i 个单位向量 Vi 上的,投影长度的平方,和,的平方根

    那这意味着什么呢?

    红色线段=在V1上的投影。蓝色线段=在V2上的投影。这些点越接近某个投影的轴,相对应的σ的值也就越大

    因为根据定义,每个σ都包含了对应的轴上所有点投影长度的和,所以这些σ表示了所有的点有多靠近相应的轴

    例如 σ12 ,那么相对于 V 2 ,大部分的点都更加接近 V 1

    这在SVD的无数应用程序中具有巨大的实用价值。


    SVD的主要应用

    计算矩阵SVD的算法不会乱用投影方向(矩阵V的列)。

    它们将这些投影方向作为数据集(矩阵A)的主成分(Principal Components)

    这里有一篇关于主成分分析的文章 Dimensionality Reduction For Dummies — Part 1: Intuition(原文作者关于特征降维系列的第一篇,不FQ也可以看,只是加载的慢),直观的解释了PCA中的PC是什么。也可以参考我的翻译主成分分析直观理解。下面是简单的表示:

    PC就是方差最大的直线

    降维的主要目的就是将数据集投影到方差最大的直线(或平面)上:

    品红色:投影之前的点。紫色:投影之后的点(降维)

    使用SVD使数据集的投影变的很简单,因为所有的点都已经投影在了 所有的主成分上 (单位向量Vi )

    例如,将数据集投影到第一个主成分上…

    我们所需要做的就是移除所有与第一个主成分无关的列。现在数据集的投影是A'

    两个矩阵相乘(SVT)得到包含投影点的A'矩阵,如最后一张坐标图所示(紫色的点)

  • 相关阅读:
    软件建模之UML图形讲解
    Android中级第八讲安卓子线程,以及定时任务使用讲解
    有你同行,我不会寂寞物联网操作系统Hello China后续开发计划及开发者征集
    物联网操作系统再思考Hello China操作系统的运营商网络协同机制
    Windows Phone 7 Storage
    Silverlight &Windows phone7 中使用Isolated Storage存储与读取图片
    Windows Phone7的Pivot控件简介
    windowsphone7的启动器和选择器
    如何将App的图标放到起始页面
    WebBrowser控件用法总结
  • 原文地址:https://www.cnblogs.com/DismalSnail/p/13635736.html
Copyright © 2011-2022 走看看