%K-L变换的基本原理是去掉样本集合数据(矢量)的分量相关性。
% % 具体做法是对一组N维样本向量,先求出其协方差矩阵,将协方差矩阵对角化, % 得到本征向量,这些本征向量组成了N维空间的一组正交基,从本征向量中选取对应本征值较大的若干个作为变换矩阵的列, % 用这个变换矩阵对原有样本进行线性变换,投影到一个特征空间中,得到的向量称为特征向量。K-L变换可以用来进行样本压缩和特征提取。 % 实际问题中它要求样本集合的分布应该比较紧致, % 如满足高斯分布,这样样本的能量才能集中在较少的几个本征向量的方向上。 clear;clc; % %线性分类; x1= [-5 -5;-5 4;4 -5;-5 6;-6 -5;]; x2=[ 5 5;5 6;6 5; 5 4; 4 5]; x=[x1;x2]; % 用PCA 变换来做一维特征提取 X=x1+x2; m0=sum(sum(X)); %令p(w1)=p(w2)=0.5; y1=x1'; y2=x2'; w1=y1; z1=y1*y1'; z2=y2*y2'; r=1/10*(z1+z2); % p=poly(r); % ploy 用来产生特征多项式系数向量 % root=roots(p) % 求r的特征值 % sort(root()); [E,D]=eig(r);%矩阵的特征值 %eigenvalues =flipud(sort(diag(D))); % 对特征值按逆序排序 [eigD,IX]=sort(diag(D),'descend'); % 特征向量矩阵按特征值的调整作对应调整 eigE(:,1:length(IX))=E(:,IX);% disp('协方差矩阵的特征值:');disp(eigD); disp('协方差矩阵对应于特征值的特征向量(列)矩阵:');disp(eigE); % 样本集X的协方差矩阵 Covx= cov(x); disp('样本集的协方差矩阵:');disp(Covx); % 协方差矩阵CovX的特征值eigenvalue(D)与对应的特征向量矩阵eigenvector(V) [E,D] = eig(Covx); % 对特征值按逆序排序 [eigD,IX]=sort(diag(D),'descend'); % 特征向量矩阵按特征值的调整作对应调整 eigE(:,1:length(IX))=E(:,IX); disp('协方差矩阵的特征值:');disp(eigD); disp('协方差矩阵对应于特征值的特征向量(列)矩阵:');disp(eigE); % 对样本集X进行PCA Y=(x-repmat(mean(x,1),10,1)) * eigE; disp('样本集x:');disp(x); disp('样本集x经PCA后的结果:'); disp(Y); Srange = minmax(x(:,1)'); % 样本集变化范围 Smean = mean(x); % 样本集中心点 % PCA主轴的方向向量 e=transpose(eigE(2,:)./eigE(1,:)); % PCA主轴的方程 y=e*(Srange-Smean(1))+Smean(2); y=y'; % 绘制样本点及PCA主轴 plot(x(:,1),x(:,2),'r+'); hold on;plot(Srange,y);legend('样本点','PCA主轴一','PCA主轴二'); axis equal;hold off; |
|