主成分分析是一种线性降维方法,线性降维的另外一种方法是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;%降维

 线性判别分析:

LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的。这点和PCA不同。PCA是不考虑样本类别输出的无监督降维技术。LDA的思想可以用一句话概括,就是“投影后类内方差最小,类间方差最大”。什么意思呢? 我们要将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。

主要计算的有两个矩阵:类内散度矩阵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;

 

 

 

 

 

 

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-19
  • 2022-12-23
  • 2022-02-16
  • 2021-08-05
  • 2021-11-20
  • 2021-08-21
猜你喜欢
  • 2022-12-23
  • 2022-01-18
  • 2022-12-23
  • 2022-12-23
  • 2021-12-09
  • 2021-07-29
  • 2022-12-23
相关资源
相似解决方案