模式识别在做SVM支持向量机的分类问题的时候,考虑到读取的图片特征数过大,如我的图片进行压缩之后还是有8100多的特征,而我的训练样本数只有600多张,需要用PCA降一下维,但是平时学的PCA降维要求样本数要大于特征数的,不然求不出协方差矩阵。
我们老师说可以将训练样本的特征集转置过来求主成分向量大同小异。
然后我就着手试一试了。代码如下,传入参数 X是特征集,如我的图片641张,一张图片8100特征,所以X = 641*8100,
explained_leval 是希望保留百分之几的主成分特征,我保留80% ,所以explained_leval = 80,Xout 是降维后的特征集,Xvector 是前80%的主成分向量。
% 样本数小于特征数的pca降维
function [Xout,Xvector] = pca(X, explained_leval)
%X = trFeature;
X = X';
av = sum(X)/length(X);
Xav = []; % 去均值后
for i = 1:length(av)
Xav = [Xav, X(:,i)-av(i)];
end
Xcov = cov(Xav); % 协方差
% Coeff的第i列是第i个主成分的系数向量
% latent是p个主成分的方差构成的向量
% explained是p个主成分的贡献率向量,已经转化为百分比
[COEFF,latent,explained]=pcacov(Xcov);
explained_sum = 0;
%explained_leval = 80; % 提取百分比的特征
for times = 1:length(explained)
explained_sum = explained_sum + explained(times);
if explained_sum >= explained_leval
break;
end
end
Xvector = X*COEFF(:, 1:times); % Xvector 为向量
Xout = X'*Xvector; %降维结果 = 样本 * 向量
首先去均值,求协方差,然后求主成分向量等等,跟之前PCA步骤一样,噢,前面的特征集需要转置一下!
转置后的特征集乘以向量得出新的向量,然后再用原来的特征集乘以新的向量得出最终结果。
另外测试样本也需要PCA降维,直接将训练样本的特征矩阵乘以新的主成分向量Xvector 即可,如1*8100 的样本乘以Xvector 就可以了。
支持向量机实现的分类最终结果: