简单而不失优美的SVD分解

零.  引子——高维空间与西瓜

这学期选课有一门“网络数据挖掘”,原来特别担心与本学期选的一门“模式识别与数据挖掘”在一定程度上相重复,不过还好,这个老师讲课不是照本宣科,讲得更多的是个人的理解还有从业经验。

今天讲得挺有意思的一点是,在讲到聚类的时候,老师有些嗤之以鼻,说在高维空间内,聚类算法可能并不会像我们想的那么理想,比如我们在使用k-means算法的时候,我们通常认为数据的分布(在二维)是这样的:

但是往往情况可能并不是如我们所看到的那样直观,就比如我们如果假设在数据分布在一维空间内,而且样本分布大概占总取值区间的一半:

那么我们直观地有:

$${R_{sample1d}} = {1 over 2}$$

进一步,如果我们是在二维空间,在每个维度上,样本取值区间也是总取值区间地一半,那么样本分布空间占总空间的大小:

$${R_{sample2d}} = {1 over 4}$$

于是可以继续这样递推,可想而知,如果认为在高维空间内样本取值域是一个超球体(像一个西瓜),那么有些出人意外地,在我们不太care的瓜皮部分,是占据了绝大部分空间的。

前面讲这些,算是一个引子,我们对于高维空间的认识,要比我们自己认为的迟钝得多,而恰恰很讽刺的是,我们所面临的问题往往都是高维数据,我们对此的做法往往也只有凭借数学工具去探索,此时任何主观的假设往往都会背离实际。

一. SVD分解介绍

0. 先验知识

  (1)线性子空间

   设V是一个非空集合,P是一个域。若:

      • 在V中定义了一种运算,称为加法,即对V中任意两个元素α与β都按某一法则对应于V内惟一确定的一个元素α+β,称为α与β的和。
      • 在P与V的元素间定义了一种运算,称为纯量乘法(亦称数量乘法),即对V中任意元素α和P中任意元素k,都按某一法则对应V内惟一确定的一个元素kα,称为k与α的积。

     称V为一个线性子空间。

  (2)生成矩阵的四个基本子空间

      对于定义在${R^m}$空间的向量组${v_1},{v_2},{v_3}...{v_n}$生成(spanning)的线性子空间${A_{m*n}}$

      我们可以定义以下的四个基本子空间:

      • 列空间C(A): 列空间定义空间${R^m}$上,矩阵A的列空间就是矩阵A中各列的线性组合。假设矩阵的秩为r,矩阵为m*n的矩阵,则列空间可以表示为r个主元的线性组合,即列空间的维数为r。
      • 行空间R(A):行空间定义在空间${R^n}$,可以对称的从C(${A^T}$)来理解行空间
      • 零空间N(A):零空间定义在行空间定义在空间${R^n}$,假设矩阵的秩为r,矩阵为m*n的矩阵,则零空间的维数为n-r。因为秩为r,则自由变量的个数为n-r,也以找到相应数量的基底。
      • 左零空间N(${A^T}$):定义在${R^m}$,同样也可以从对称角度去理解左零空间。

   (3)四个基本子空间的关系

     我们知道,矩阵A是一个线性映射${R^n} o {R^m}$,其映射关系也可以清楚地从下面的图中表达出来:

    

   从上图我们可以看出来:

   【1】行空间里面的任何向量都可以被线性组合A映射到列空间

   【2】对于解线性方程组,这种映射相当于是一种特殊解,如果加上零空间的基的组合,那么映射关系也成立,这就是为什么线性方程组解等于非齐次的特解加上齐次的通解。

   【3】行空间和零空间正交(注意是空间正交而不是向量正交);同样,列空间和左零空间正交。

2. 模型介绍

  开始讲一下SVD分解。

  其实SVD分解不是一个概率模型,甚至跟我们平时遇到的非概率模型不一样。

  平时我们遇到的SVD分解,往往是求一个判别面,比如感知机、SVM等(决策树是多个分类面)

  SVD分解的优美性在于,仅仅凭借纯数学的代换,就完成复杂的聚类分析,并且提供了数值依据,没有任何歧义。

  简单的讲,SVD分解,就是将原来的矩阵A拆分成三个矩阵的乘积,这三个矩阵分别是U、Σ、V

  也即

$$A = USigma {V^T}$$

  其中,V描述了原始空间中的正交基,U描述了相关空间的正交基,Σ描述了V中的向量变成U中的向量时被拉伸的倍数。

二. 模型推导

  SVD分解作为一种很简单,但同时也是最重要的一种分解,当我们第一次看到这个分解的时候,我们不应该是仅仅直接照抄了式子就完了,我觉得很重要的,就是要知道:

  • 这个式子从何而来,数学解释是什么
  • 有什么好的性质,为什么能够表达聚类、推荐、压缩?
  • 在分解A的时候,为什么会牵扯到${A^T}A$和$A{A^T}$

  因此,我觉得,很有必要去追溯SVD的前世今生。

1.特征分解

 在考虑矩阵A的分解之前,我们先考虑特殊的矩阵,也就是方阵,特别是满秩方阵。

  我们知道,若A是方阵,那么,对于其任意特征向量v,我们都有:

  $$Av = lambda v$$

  进一步,我们有:

  $$A = VSigma {V^{ - 1}}$$

 特别地,当A为对称阵,那么其特征向量为正交基(${V^{ - 1}} = {V^T}$),那么我们有:

  $$A = VSigma {V^T}$$

   这个已经很像SVD分解了,事实上,我们可以看到,等式右侧是一个投影矩阵,我们试想,如果A不是满秩的话,那么就是说对角阵的对角线上元素存在0,这时候就会导致维度退化,它将n维向量投影到它的列空间中。

  并且,我们可以发现,如果我们如果我们指定一个向量${v^*} = {a_1}{v_1} + {a_2}{v_2} + ... + {a_n}{v_n}$(在这里,我们也可以认为是行空间)

  那么我们可以发现,这个由正交基底组成地向量在经过映射之后,还是落入到了另一组正交基底(虽然是重合的)上。

  因此,我们想能不能进一步将这种做法加以推广,但是显然,特征分解只能针对于方阵,对于矩阵我们无法进行特征分解,因此我们进一步引出了奇异值分解。

2. 奇异值分解

  考虑我们上面的做法,不考虑零空间,我们试图在行空间内找到一组正交基底(特别是单位的),我们试图让它经过A的映射,得到的基底仍然保持正交

  我们可以写作:

$$AV = USigma $$

  进一步,由于V是单位正交的,那么我们有:

$$A = USigma {V^T}$$

  考虑求解U,那么我们必须要消去V,显然,我们可以用A乘以${A^T}$

  于是我们有:

$$A{A^T} = USigma {V^T}V{Sigma ^T}{U^T} = USigma {Sigma ^T}{U^T}$$

  很“巧合”,$A{A^T}$恰好是一个对称方阵,那么我们由1,就会有U是$A{A^T}$(至少是半正定的)特征向量组成的单位正交基。

  同理,我们很容易得到V矩阵,它也恰好是${A^T}A$特征向量组成的单位正交基。  

-----------------------------------------------------------------------

  于是,我们发觉,SVD分解恰好是对其映射空间的一种分解,它的优美性在于,在分解后的行空间里,是没有内部依赖的,也就是说是正交的。

  列空间也如是。

  那么零空间呢,我们会发现,零空间在矩阵$Sigma $右下对角线为0的地方体现出来。

  经过这些步骤,一个线性变换的全部映射关系就被我们完全发掘出来了。

三. 模型应用

有关于SVD的分解的应用,有很多,简要的提点一下,但是不展开来讲。

1.聚类划分(推荐系统、文本挖掘。。。)

  这种应用场景是将原矩阵D看作是一种概率分布矩阵(但是并不一定归一化)

  那么很明显,整个矩阵的分解过程恰好可以写成对于这个条件概率的一种分解,具体可以参考苏剑林的博客为什么SVD意味着聚类

  简单来讲,对于原矩阵A,我们可以将其看作是一种概率分布矩阵:

$$P(B|A)=egin{pmatrix}p(b_1|a_1) & p(b_2|a_1) & dots & p(b_n|a_1)\
p(b_1|a_2) & p(b_2|a_2) & dots & p(b_n|a_2)\
vdots & vdots & ddots & vdots\
p(b_1|a_m) & p(b_2|a_m) & dots & p(b_n|a_m)end{pmatrix}$$

  归一化条件是:

$$sumlimits_{j = 1}^n p ({b_j}|{a_i}) = 1,;;;{kern 1pt} i = 1,2, ldots ,m$$

  这样自然有:

$$p({b_j}|{a_i}) = sumlimits_{k,l} p ({b_j}|{d_k})p({d_k}|{c_l})p({c_l}|{a_i})$$

  从而:

$$P(B|A) = P(B|D) imes P(D|C) imes P(C|A)$$

  恰好是三个矩阵乘法的体现。

2.数据除噪

  即按照能量大小将那些噪音项设置为0,从而滤除掉数据的噪音。

3.数据压缩

  SVD分解本来就是将一个大矩阵拆解为几个小矩阵,这种压缩尤其在数据稀疏性和低秩性的时候表达的更加充分。

四. 结语

1.SVD分解是将一个矩阵分解为它的左特征空间矩阵和右特征空间矩阵,而中间的特征值矩阵则是代表着权值,因此我们每次只要选取那些重要的特征留存下来,就可以几乎没有损耗的还原原矩阵。

2.我们可以看到,对于左特征矩阵的每一个聚类和每一个右特征矩阵的聚类是一一对应的,这也是合理的,因为在原矩阵中他们就是彼此依存的,同时,UV矩阵都是对于原矩阵的一种表达,它们具有一一映射关系。

3.SVD分解可以看成是原矩阵的一种低秩表达,也就是说由于原矩阵表示的项目之间必然是有一定耦合关系的,因此原矩阵不管是从行看还是从列看,都必然有很多线性相关(或近似)关系,这也是聚类的一个很重要前提。

4.我们如果将U矩阵按行拆解出来,${V^T}$矩阵按列拆解出来,那么我们便能得到一系列秩一矩阵,此时我们实际上得到的是矩阵空间的对于A矩阵的拆解。

5. 我还希望大家能够注意到对称方阵${A^T}A$,应该说我们对它并不陌生,甚至于还特别熟悉,我们在求解矛盾方程组或者说在进行线性拟合的时候,便也出现了这个神奇的矩阵,我们如果深挖便会发现${A^T}A$矩阵相对于原矩阵有很多奇妙的相似性质,并且针对于落在原矩阵值域空间之外的向量,有着一种掰弯(投影)效应,因此在很多时候我们会看到它的身影。

原文地址:https://www.cnblogs.com/sugar-mouse-wbz/p/9763517.html