经过两天的挣扎,在浅薄的线性代数知识基础上,尝试着理解了一下主成分分析法。
一 算法流程
求样本x(i)的n'的主成分其实是求样本集的协方差矩阵 XXT 的前n'个特征值对应特征向量矩阵W,然后对于每个样本x(i)做如下变换 z(i)=WTx(i) ,即达到降维的PCA目的。
具体算法流程:
输入:n维样本集D=(x(1),x(2),...,x(m)), 要降维到维数n’。
输出:降维后的样本集D’
(即从mxn变为mxn')
1)对所有的样本进行中心化。
2)计算样本的协方差矩阵XTX
3)对矩阵XXT进行特征值分解
4)取出最大值n'个特征值对应的特征向量(w1,w2,...,wn'),将所有的特征向量标准化后,组成特征向量矩阵矩阵W。
5)对样本集中的每一个样本x(i),转化为新的样本z(i)=WTx(i)
6)得到输出样本D’ = (z(1),z(2),...,z(m))
有时候,我们不指定降维后n'的值,而是换种方式,制定一个降维到主成分比重阈值t。这个t在(0,1]之间。加入我们有n个特征值λ1>=λ2>=...>=λn,则n'可以通过下式得到:
二 个人的理解
[18.11.23更新]PCA和LDA都是对数据进行降维,其中PCA是无监督的,LDA是有监督的。所以PCA是不考虑类别的,只用特征信息,而LDA要考虑类别,他们之间降维的差异于是有了这个图:我理解,PCA是采用了投影最小的方法,在图中表现出来就是点与投影点之间的距离和最小,那保留最多的原始信息怎么理解呢?那就是我们去掉某一个“方向”(这是一个抽象的“方向”,或者说朝超平面进行了投影),两个点之间的“距离”保持没变。而LDA因为有了“标签”的限制,其投影的方式产生了变化,所以他的选择的是分类最好的方向。
1.对样本进行中心化的原因
1.1 做中心化的意义
中心化其实是一个平移的过程,平移后所有数据的中心是(0,0)
在PCA中,中心化后的数据有助于后续在求协方差的步骤中减少计算量,同时中心化后的数据才能比较好地“概括”原来的数据(如下图)。
其实,中心化及标准化在不同的应用场景都有不同的意义——比如在训练神经网络的过程中,通过将数据标准化,能够加速权重参数的收敛。
1.2 做中心化的方法
即 样本的每一个维度的数值减去该维度所有样本的均值(通过均值的意义或者画图很容易理解)。
2.选用协方差的原因
2.1协方差的定义
1)协方差的定义
其中:E(X) = μx、E(Y) = μy
2)协方差矩阵的定义
按照一般标准,即每一行的表示一个样本,每一列表示相应的维度。
注:协方差矩阵的维度等于样本的维度数(随机变量的个数)。至于这里为什么是m-1,我相信与概率论中求样本方差的时候所谓无偏估计和有偏估计有关吧(为什么样本方差(sample variance)的分母是 n-1?——知乎 然而我又不会,真是惨兮兮)
例子(协方差矩阵计算方法——GodStephen) 我发现博主在计算的过程中其实就就进行了我们所谓的中心化。
2.2 协方差在这里的图形化意义
我们选取协方差的特征向量,一句话概括就是找到方差在该方向上投影最大的那些方向。
我们在应用PCA的时候,都默认数据符合高斯分布(即正态分布:期望为 μ,方差为σ^2 的正态分布,记为N(μ,σ^2)——然而我还是不懂,概率论不会真的惨兮兮x2),所以能产生下图嗯,没错,这是由图左边的矩阵作为协方差矩阵产生的高斯分布样本,当我们做出一个椭圆过后,可以很轻易地猜想,若从二维降低到一维,那么一定选择黑色的长轴作为投影空间,然后,惊讶地发现这个长轴就是最大特征值对应的特征向量(0.707,0.707)。所以我从直观上接受了做协方差的特征向量作为投影空间。
2.3 协方差在这里的一种理论推导
距离
我们一般有两种常用的距离:欧氏距离和余弦距离。
余弦距离:表示关系的距离。即两个向量的夹角,可以通过点积和模长计算。
协方差和相关系数
因为一开始我们已经对数据做了中心化,所以可以有如下表示:具体的推导和理解参考下面的链接。
【蒟蒻还需要增加对知识的原始积累才能在数学层面上理解啊
如何理解协方差、相关系数和点积?——马同学
3.特征值和对应特征向量的意义
特征值和特征向量有非常深的现实内涵。
1.3Blue1Brown中的理解
在3Blue1Brown中,将方阵作为对基的一种线性变换。(将以二阶行列式为例)
i-hat和j-hat是向量空间的一组基。
当我们的方阵不是I方阵时,相当于我们对坐标系进行了旋转和剪切。
当我们对一个向量做这个矩阵乘法时,就相当于是对向量随这个矩阵表示的线性变换变化,输出就是经过此变化后的向量在原坐标系中的坐标。
其实从我们刚才做出的乘法可以看到,方向在[-1,1]T的向量经过线性变换后向量的方向并没有变,只是相对大小有了变化。所以,我们可以猜想:
※特征向量即为经过线性变换后方向没有变化的向量,特征值即为向量变化后的倍数。
其实3b1b中有线性代数篇有很多有意思的理解,比如基变换等,挖坑。
2.知乎的理解
总的来说,矩阵相乘就是对点(用向量的终点表示整个向量)进行拉扯。
※特征值是运动的速度,特征向量是运动的方向。
我尝试了一下,矩阵A为[3,0;2,1],此方阵的特征值为1的特征向量为[0,1]T(橙色),特征值为3的特征向量为[0.7071,0.7071]T(蓝色)
方向向量为[0.5,-0.2]T,在下图中即为橙色的点。
p1=[0.5;-0.2] ; p2=[1.5;0.8]; p3=[4.5,3.8]; p4=[13.5,12.8];
p5=[40.5;39.8]; p6=[121.5;120.8]; p7=[364.5;363.8]; p8=[1093.5;1092.8];
因为这个矩阵比较特殊,所以我又做了一个特征值相近的矩阵。
矩阵A为[2.5 0.5;0.5 2.5],此方阵的特征值为2的特征向量为[-0.7071,0.7071]T,特征值为3的特征向量为[0.7071,0.7071]T
方向向量为[1,0]T。
A = [2.5,0.5;0.5 2.5];
x = (-50:50);
y = (-50:50);
plot(x,y);
grid on;
hold on;
y = (50:-1:-50);
plot(x,y);
hold on;
t = [1,0]';
for i = 1:5
plot(t(1,1),t(2,1),'*');
t = A*t
end
补1.投影
补2.奇异分解
U和V为一组规范正交基,表示A矩阵的作用是将一个向量从U这组正交基向量的空间旋转到V这组正交基向量空间,并对每个方向进行了一定的缩放,缩放因子就是各个奇异值。如果V的维度比U哒,则表示还进行了投影。可以说奇异值分解就是将一个矩阵原本混在一起的三种效果分解出来。
奇异分解是对特征值分解的一种拓展。特征值倾向于找到一个方向,使得线性变换对这个方向的向量仅起到长度的变化;奇异分解则是希望找到一组标准正交基,使得线性变换作用在这组基之后能够得到正交的新基——当然这组基不一定是标准的,(二维)在标准基选择360度后,新基能做出一个椭圆,其中奇异值就是分别是长半轴和短半轴的长度。
如eigshow, week 3中第一个图,绿色的表示我们原始的基,蓝色的分别表示矩阵A作用在x方向和y方向上向量的效果,当我们对绿色进行旋转的时候,蓝色会对应开始旋转,当绿色旋转到某一角度的时候,蓝色正交,此时绿色即为我们想要的那一组。我只能暂时理解为矩阵将向量从绿色的正交基变换到蓝色的正交基后的结果。
补3.正定矩阵
补4.KPCA
理解KPCA其实只需要理解核函数就行了(同理SVM),因为它不过是对点进行了升维操作。
降维or分类其实是一个优化问题,恰好在损失函数中出现了xxT的形式,记住这个形式。
在部分分类情况中,发现如果用线性的切分(对超平面做了线性的限制),没有办法很好的进行分类,于是就提出来,将原来的点x(n维),通过函数φ,映射为x‘(m维),通过增加维度,让线性切分能够适用。
这样就造成了一个问题:维度的扩大会导致计算量的增加。
在观察损失函数后,我们发现其实升维之后,不过是xxT变为了φ(x)φ(xT),这个内积的形式仍然存在,于是就有聪明人想:既然我们对升维之后的点的操作是固定的(即都是内积操作),那我们是否能找到一个函数,使得其内积操作的结果有一个很好的性质,能够跳过升维操作(即极端的说法为:φ(x)φ(xT)=2*xxT)。
还真有人发现了一些函数具有如此的性质,我们就站在巨人的肩膀上,把这些能够跳过升维计算量,但是确实对点进行了升维操作的函数叫做核函数。