【问题标题】:Dimensions Reduction in Matlab using PCA使用 PCA 在 Matlab 中减少尺寸
【发布时间】:2016-02-08 04:48:39
【问题描述】:

我有一个包含 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。基于此,我决定只取第一个组件。所以我做了以下操作:

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 数量的函数:

按照@zelanix 的建议,此图是在进行 PCA 之前进行归一化之后生成的:

这也是绘制的图形:

解释了在 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

【问题讨论】:

  • 矩阵有多少行你正在运行pca
  • 你的特征是不是比观测值多?
  • 我的数据矩阵大约是 100K 行 X 35 列。
  • 在这 100K 中,大约 8K 是正数,92K 是负数,

标签: matlab svm pca


【解决方案1】:

PCA 给出了数据中最大方差的方向,它不一定要做更好的分类。如果您想在尽量提高准确性的同时减少数据,您应该使用LDA

下图正是我想表达的意思。

【讨论】:

    【解决方案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))
    

    【讨论】:

    • 感谢 @zelanix 在 PCA 之前应用归一化后我得到了更好的结果。我注意到“解释”值也发生了变化,现在,它清楚地表明我需要大约 24 个组件,这是有道理的!
    猜你喜欢
    • 2014-05-31
    • 2019-01-04
    • 2015-07-19
    • 2011-08-21
    • 2017-11-29
    • 2019-02-04
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多