之前面试的时候也被问到了PCA降维相关的问题,这里记录一下
在PCA当中我们用到了矩阵分解相关的知识,在PCA中我们可以通过两种方法来进行矩阵分解
矩阵分解
1. 特征分解
对于一个n维的方阵A,如果我们求出其特征值和特征向量,那我们可以将A分解为:
其中,W是一个由特征向量构成的矩阵,而是一个对角矩阵,对角线上的元素是A的特征值,注意到如果我们想要用特征分解,前提是我们的矩阵A必须是一个n维的方阵,如果不是的话我们可以尝试用SVD进行矩阵分解
2. 奇异值分解SVD
SVD适用于任意矩阵,对于任意矩阵都存一个奇异值分解:
其中U和V都是unitary matrix酉矩阵,也就是说,U中的向量我们称为左奇异向量,V中的向量我们称为右奇异向量,而sigma中的对角线上的元素称为奇异值,那要怎么求这三个量呢:
1. 如果我们对A和A的转置做矩阵乘法,那我们就可以得到一个方阵,然后我们就可以对这个方阵采取特征分解,从而求得特征值和对应的特征向量
2. ,这样我们就可以求得m个特征值以及对应的特征向量ui,我们将这个m个特征向量铺成一个m*m的矩阵也就是上面式子里的U, 证明:
(特征分解),可以看出来的特征向量就是我们SVD中的U
3. 这样我们就可以求得n个特征值以及对应的特征向量vi,我们将这个n个特征向量铺成一个n*n的矩阵也就是上面式子里的V, 证明
,可以看出来的特征向量就是我们SVD中的V
4.求得了U和V,我们就可以求了
另外, 从上面第三步第四部的的证明可以看出来 ,所以我们也可以直接用 的方法直接去计算
下面要进入正题了,
PCA是什么
PCA也叫主成分分析,是一种数据降维的方法,PCA的主要思想就是将原有的n维的数据投影到k维上,这k维是全新正交的的主成分,是通过一种映射方法,从原有的n维特征中重新构造出来的,其中新的n维中的第一个维度或者第一个坐标轴选择是原始数据中方差最大的方向,第二个坐标轴的选取是从正交与第一个坐标轴的平面中选择方差最大的,以此类推。实际上大部分的方差都集中在前k个维度当中,于是我们可以忽略剩下的坐标轴只保留前k个坐标轴,以此达到数据降维的目的
这里我们通过计算数据的协方差矩阵,然后计算其特征值和对应的特征向量,将特征向量按照其特征值进行排序,取前k维作为映射矩阵,然后我们就可以把原数据通过映射矩阵映射到新的维度当中去了。
首先我们知道协方差矩阵可以用来表示样本之间的相关关系,那我们对协方差矩阵进行特征分解,得到的特征值的意义,就可以被理解为是数据在特征向量方向上的方差,特征值越大,说明方差越大。
PCA算法的具体步骤
输入:数据集
1. 基于特征分解:
step1. 去中心化,对于每一个特征减去其平均值,去中心化可以有效的提高算法的准确度
step2. 计算协方差矩阵
step3. 对协方差矩阵进行特征分解,从而得到特征值和特征向量
step4. 对特征值从大到小排序,选择其中最大的k个,然后将其对于的k个特征向量分别作为行向量组建一投影矩阵
step5. 投影矩阵与数据做矩阵乘法,将数据投影到新空间中
#由于,协方差矩阵是方阵,所有这里使用特征分解是没问题的
2.基于SVD
step1. 去中心化,对于每一个特征减去其平均值,去中心化可以有效的提高算法的准确度
step2. 计算协方差矩阵
step3. 通过SVD计算协方差矩阵的特征值和特征向量
step4. 对特征值从大到小排序,选择其中最大的k个,然后将其对于的k个特征向量分别作为行向量组建一投影矩阵
step5. 投影矩阵与数据做矩阵乘法,将数据投影到新空间中
#使用SVD算法的好处:
1.有一些SVD的实现算法可以先不求出协方差矩阵,也能求出左右奇异矩阵U和V,也就是说省去了中间特征分解的步骤,从而提高了计算效率。
2. 通过SVD直接求出来右奇异矩阵,取其前k行作为映射矩阵就可以直接用来做降维了:
另外,取左奇异矩阵的前k行作为映射矩阵,我们还可以对数据进行行压缩起到去除冗杂样本的作用
PCA方法的缺点
1. PCA属于无监督的范畴,PCA将所有样本看作一个整体对待,而忽视了样本的类别属性,如下图这种情况:
2. PCA是一个线性降维方法,对于非线性的数据处理的不好,这里线性可以理解为,在pca降维的过程中,我们是通过一个映射矩阵乘上数据做的降维,这个过程可以看作是一个线性变换
针对第二个问题,有一个核主成分分析KPCA,其思想与SVM的核函数类似,既然数据在低纬不可分,那我们尝试将数据映射到一个高纬可分的空间,然后再用PCA的处理方法进行降维
针对第一个问题,我们要把样本的标签信息也考虑进去,所以我们可以用LDA线性判别分析来做降维
LDA
#回头补上
网友评论