使用PCA在Matlab中降低尺寸

时间:2015-11-06 22:52:56

标签: matlab svm pca

我有一个包含35列的矩阵,我正在尝试使用PCA减少维度。我在我的数据上运行PCA:

[coeff,score,latent,tsquared,explained,mu] = pca(data);
explained =
     99.9955
      0.0022
      0.0007
      0.0003
      0.0002
      0.0001
      0.0001
      0.0001

然后,通过查看向量explained,我注意到第一个元素的值是99.基于此,我决定只采用第一个compoenet。所以我做了以下的事情:

k=1;
X = bsxfun(@minus, data, mean(data)) * coeff(:, 1:k); 

现在,我使用X进行SVM培训:

svmStruct = fitcsvm(X,Y,'Standardize',true, 'Prior','uniform','KernelFunction','linear','KernelScale','auto','Verbose',0,'IterationLimit', 1000000);

然而,当我试图预测和计算错失分类率时:

[label,score,cost] = predict(svmStruct, X);

结果令人失望。我注意到,当我只选择一个组件(k=1)时,我的所有分类都是错误的。但是,随着我增加所包含组件的数量k,结果会有所改善,如下图所示。但根据explained,这没有意义,这表明我应该只使用第一个特征向量。

我有错吗?

此图显示分类错误与包含的eginvectors数量的函数关系: plot

按照@zelanix的建议,在执行PCA之前进行规范化之后生成此图: enter image description here

这也是绘制的图形: enter image description here

以及解释在PCA之前进行标准化后获得的值:

>> [coeff,score,latent,tsquared,explained,mu] = pca(data_normalised);
Warning: Columns of X are linearly dependent to within machine precision.
Using only the first 27 components to compute TSQUARED. 
> In pca>localTSquared (line 501)
  In pca (line 347) 
>> explained

explained =

   32.9344
   15.6790
    5.3093
    4.7919
    4.0905
    3.8655
    3.0015
    2.7216
    2.6300
    2.5098
    2.4275
    2.3078
    2.2077
    2.1726
    2.0892
    2.0425
    2.0273
    1.9135
    1.8809
    1.7055
    0.8856
    0.3390
    0.2204
    0.1061
    0.0989
    0.0334
    0.0085
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000
    0.0000

2 个答案:

答案 0 :(得分:2)

PCA给出了数据中最大方差的方向,它不一定要做更好的分类。如果您希望在尝试最大限度提高准确性的同时减少数据,则应执行LDA

下图说明了我想传达的内容。

enter image description here

答案 1 :(得分:2)

Parag S. Chandakkar绝对正确,没有理由认为PCA会自动改善您的分类结果。这是一种无监督的方法,因此不是为了改善可分性,而是为了找到方差最大的组件。

但是您的代码还存在其他一些问题。特别是,这条线让我困惑:

X = bsxfun(@minus, data, mean(data)) * coeff(:, 1:k);

您需要在执行PCA之前规范化数据,并且每个功能都需要单独规范化。我使用以下内容:

data_normalised = data;

for f = 1:size(data, 2)
    data_normalised(:, f) = data_normalised(:, f) - nanmean(data_normalised(:, f));
    data_normalised(:, f) = data_normalised(:, f) / nanstd(data_normalised(:, f));
end

pca_coeff = pca(data_normalised);

data_pca = data_normalised * pca_coeff;

然后,您可以将第一个主要组件提取为data_pca(:, 1)

此外,始终绘制您的PCA结果,以了解实际情况:

figure
scatter(data_pca(Y == 1, 1), data_pca(Y == 1, 2))
hold on;
scatter(data_pca(Y == 2, 1), data_pca(Y == 2, 2))