协方差矩阵与特征值及其特征向量
最近在利用协方差矩阵计算些东西,对结果有点混乱,所以打算整理一下这方面的东西。
一 协方差矩阵
首先,关于协方差矩阵的公式都见得到这里就不摆了。
理解协方差矩阵是:
- 协方差矩阵相对于协方差是能处理多维问题
- 输入协方差矩阵中的数据:行表示样本,列表示维度
- 协方差矩阵是一个对称矩阵,无论输入的数据mxn中样本数m多大,最终得到的都是nxn的方阵
- 协方差矩阵度量的是维度与维度之间的关系,所以协方差计算的是不同维度之间的协方差
- 协方差矩阵计算时是按列进行计算均值的;协方差矩阵对角线上的元素是各个维度的方差,其他元素是两两维度间的协方差(相关性)
- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
二 协方差矩阵与PCA
主成分分析(Principal Component Analysis,简称PCA),简单来说就是一个通用的降维工具。
PCA是找出最能够代表原始数据的投影方法,即降维后的数据不能失真,降掉的那些噪声或是冗余的维度数据,把高维的数据通过线性变换投影到低维空间上去。
而PCA实现的关键就是通过协方差矩阵。参考前面描述的协方差矩阵,要降掉的是相关性很小的(噪声)维度,协方差矩阵提供了这一数据,即把协方差矩阵非对角线上的元素趋近于零,通过矩阵对角化实现。
对角化后得到的矩阵,其对角线上是协方差矩阵的特征值:各个维度新方差;对角化后剩余维度之间的相关性已经减弱,完成去噪。
去除冗余,对于得到的对角化后的新方差矩阵只取那些含有较大方差(特征值)的维度,其余的舍掉即可。
所以,PCA的本质其实就是对角化协方差矩阵。
结合协方差矩阵进行主成分分析大致流程:
- 得到样本矩阵,样本矩阵中心化
- 计算样本矩阵的协方差矩阵
- 对协方差矩阵进行特征值分解,选取p个特征值对应的特征向量组成投影矩阵
- 对原始样本矩阵进行投影,得到降维后的新样本矩阵
注 :PCA实现:协方差矩阵的特征值分解cov()与奇异值分解svd()。(后面阐述)
- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
三 MATLAB实现
(假设原始样本矩阵是mxn,随机产生m = 20,n = 3)
计算协方差矩阵:
%中心化样本矩阵 or
%得到协方差矩阵
%得到协方差矩阵
对协方差矩阵进行特征值分解:
注:这里的维度为三维,所以全保留。且eig()函数得到的结果是升序排列的
D是PCA后的样本协方差矩阵(非对角线元素为0,对角线上为特征值)
V是降噪后的协方差矩阵的特征值升序排列的投影矩阵
PCA降维后的新样本矩阵:
- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注:MATLAB自带了主成分分析函数princomp()
coeff 表示投影矩阵
score 表示投影后的新样本矩阵
但,score得到的结果和S1的维度排序不一致,是因为此时计算的投影矩阵是降序排列的,与V相反。
- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
注:
奇异值分解与协方差矩阵特征值分解
一:特征值分解得到特征值与特征向量,是一个提取矩阵特征很不错的方法,前提是处理的是方阵。
所以对于属于方阵类型的协方差矩阵可以直接做特征值分解。即上述的eig()函数
特征值V:表示的是各维度的方差(默认升序排列)
特征向量D:每一特征值对应一特征向量。第一特征向量是数据特征值(方差)最大的方向,第二特征特征向量与第一特征向量垂直的方向上数据特征值(方差)最大的方向,第三特征向量与第二特征向量垂直的方向上数据特征值(方差)最大的方向,以此类推。
二:奇异值分解是一个能适用于任意的矩阵的一种分解。
分解形式
特征值,U 特征向量,左奇异向量
特征值 , V特征向量,右奇异向量
奇异值构成(对角线)
svd()函数只适合行数m大于列数n的矩阵,如果行数m小于列数m,可对其转置矩阵做SVD分解
- - - - - - - - - - - - - - - - - - - - - - -- - - -- - - - - - - - - - - - - - - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
间断性更新、完善吧。
分享,多担待。望有帮助