主成分分析是一种线性降维方法,线性降维的另外一种方法是LDA,在这两个过程中协方差矩阵的计算是最关键的部分。
核心思想:计算协方差矩阵以及其特征向量和特征值,寻找前N个最大特征值对应的特征向量,
为什么这么做:协方差矩阵(散布矩阵)在模式识别中应用广泛,最典型的应用是PCA主成分分析了,PCA主要用于降维,其意义就是将样本数据从高维空间投影到低维空间中,并尽可能的在低维空间中表示原始数据。这就需要找到一组最合适的投影方向,使得样本数据往低维投影后,能尽可能表征原始的数据。此时就需要样本的协方差矩阵。PCA算法就是求出这堆样本数据的协方差矩阵的特征值和特征向量,而协方差矩阵的特征向量的方向就是PCA需要投影的方向(https://blog.csdn.net/guyuealian/article/details/68922981 )
公式表达:
设样本特征为X,经过统计所有样本,可以得到均值特征
以特征维数为三维而言
协方差矩阵的含义:
在概率论中有一类 概念是计算两类属性之间的相关系数,计算公式为
如果相关系数的绝对值越大,则说明两个属性之间就越相关,协方差矩阵实际上就是各个维度特征之间的相关系数矩阵。通过挑选出前N个特征向量,然后将原特征在这上面做投影便可将特征降到N维平面上:
close all;
clearvars;
clc;
load('data.mat');
feats=data{1};%特征
ave_feats=mean(feats,1);
newfeats=feats-repmat(ave_feats,size(feats,1),1);
Emat=(newfeats'*newfeats)/size(newfeats,1);%sum{(x-ave_x)*(y-ave_y)}%协方差矩阵
[V,D]=eigs(double(Emat),2);%取前两维的特征向量
[V1,D1]=eigs(double(Emat),512);
X=newfeats*V;%降维
线性判别分析:
主要计算的有两个矩阵:类内散度矩阵Sw和类间离散度矩阵Sb,需要掌握的重要的计算知识是广义瑞利商的计算与性质
(具体推导过程,我觉得可以好好看看这篇博文,https://www.cnblogs.com/pinard/p/6244265.html)
、
关于广义瑞利商:
我自己的实现代码
close all;
clearvars;
clc;
%这个程序是不完整的,数据需要自己去收集
%labels为样本标注,feats为样本特征
bool1=labels(:,1)==1;
bool2=labels(:,1)==0;
num1=sum(bool1);
num2=sum(bool2);
feats1=feats(bool1,:);
feats2=feats(bool2,:);
avefeats1=mean(feats1,1);
avefeats2=mean(feats2,1);
ave_feats=mean(feats,1);
aveE1=feats1-repmat(avefeats1,num1,1);
aveE2=feats2-repmat(avefeats2,num2,1);
E1=aveE1'*aveE1;
E2=aveE2'*aveE2;
Sw=E1+E2;
Sb=(avefeats1-avefeats2)'*(avefeats1-avefeats2);
M=inv(Sw)*Sb;
[V,D]=eigs(double(M),3);
% parfor i=1:size(feats,1)
% newfeats(i,:)=feats(i,:)-ave_feats;
% end
new=feats*V;
figure(1);
plot3(new(bool1,1),new(bool1,2),new(bool1,3),'b*');
hold on;
plot3(new(bool2,1),new(bool2,2),new(bool2,3),'r*');
hold off;
% A.delete;