【问题标题】:PCA Dimension reducion for classificationPCA 降维分类
【发布时间】:2018-08-27 13:36:08
【问题描述】:

我正在对从 CNN 不同层提取的特征进行主成分分析。我已经从here下载了降维工具箱。

我总共有 11232 张训练图像,每张图像的特征是 6532。所以特征矩阵是这样的11232x6532 如果我想要前 90% 的特征,我可以很容易地做到这一点,并且使用 SVM 减少数据的训练准确率为 81.73%,这是公平的。 但是,当我尝试具有 2408 张图像的测试数据时,每张图像的特征是 6532。所以测试数据的特征矩阵是2408x6532。在这种情况下,前 90% 功能的输出不正确,它显示 2408x2408。 测试准确率为25%。 在不使用降维的情况下,训练准确率为 82.17%,测试准确率为 79%。
更新: 其中X 是数据,no_dims 是输出时所需的维数。 这个 PCA 函数的输出是变量 mappedX 和结构 mapping

% Make sure data is zero mean
    mapping.mean = mean(X, 1);
    X = bsxfun(@minus, X, mapping.mean);

    % Compute covariance matrix
    if size(X, 2) < size(X, 1)
        C = cov(X);
    else
        C = (1 / size(X, 1)) * (X * X');        % if N>D, we better use this matrix for the eigendecomposition
    end

    % Perform eigendecomposition of C
    C(isnan(C)) = 0;
    C(isinf(C)) = 0;
    [M, lambda] = eig(C);

    % Sort eigenvectors in descending order
    [lambda, ind] = sort(diag(lambda), 'descend');
    if no_dims < 1
        no_dims = find(cumsum(lambda ./ sum(lambda)) >= no_dims, 1, 'first');
        disp(['Embedding into ' num2str(no_dims) ' dimensions.']);
    end
    if no_dims > size(M, 2)
        no_dims = size(M, 2);
        warning(['Target dimensionality reduced to ' num2str(no_dims) '.']);
    end
    M = M(:,ind(1:no_dims));
    lambda = lambda(1:no_dims);

    % Apply mapping on the data
    if ~(size(X, 2) < size(X, 1))
        M = bsxfun(@times, X' * M, (1 ./ sqrt(size(X, 1) .* lambda))');     % normalize in order to get eigenvectors of covariance matrix
    end
    mappedX = X * M;

    % Store information for out-of-sample extension
    mapping.M = M;
    mapping.lambda = lambda;

根据您的建议。我已经计算了训练数据的向量。

numberOfDimensions = round(0.9*size(Feature,2));
[mapped_data, mapping] = compute_mapping(Feature, 'PCA', numberOfDimensions);

然后使用相同的向量来测试数据:

mappedX_test = Feature_test * mapping.M;

准确率仍然是 32%

做减法求解:

Y = bsxfun(@minus, Feature_test, mapping.mean);
mappedX_test = Y * mapping.M;

【问题讨论】:

    标签: matlab machine-learning computer-vision pca dimensionality-reduction


    【解决方案1】:

    您似乎正在分别对训练数据和测试数据进行降维处理。在训练期间,您应该记住训练期间示例的主要分数或基向量。请记住,您正在根据训练数据使用一组新的正交轴来寻找数据的新表示。在测试期间,您重复与训练数据完全相同的过程,因为您代表这些基向量的数据。因此,您使用 训练数据 的基向量来减少数据。您只会得到一个2408 x 2408 矩阵,因为您正在对测试示例执行 PCA,因为不可能产生超出相关矩阵等级(即 2408)的基向量。

    保留训练阶段的基向量,当需要在测试阶段执行分类时,您必须使用训练阶段的相同基向量。请记住,在 PCA 中,您必须通过在降维之前执行平均减法来使数据居中。为此,在您的代码中,我们注意到基向量存储在mapping.M 中,相关的平均向量存储在mapping.mean 中。在测试阶段,请确保您的意思是从训练阶段减去带有mapping.mean 的测试数据:

    Y = bsxfun(@minus, Feature_test, mapping.mean);
    

    一旦你有了这个,最后继续并减少你的数据:

    mappedX_test = Y * mapping.M;
    

    【讨论】:

    • 我已经用我正在使用的代码更新了这个问题。在该代码中,lambda 是特征值,M 是特征向量。所以你的意思是我应该使用与训练数据相同的M
    • 是的。正确的。减少基于训练数据,因为这是您正在构建的基础。应使用相同的基向量减少测试数据。对测试数据单独做是不正确的。
    • 是的,我已经对此进行了测试并更新了我的问题.. 仍然没有用
    • 您还需要对与训练数据具有相同均值向量的测试数据进行均值减去。是你做的吗?您必须像在训练阶段那样重复每一步。用训练数据的平均特征向量平均减去测试数据,然后做乘法。
    • @Addee 啊,这是 PCA 可能不起作用的情况之一。我建议您查看线性判别分析,因为您正在进行分类。 LDA 还通过考虑在不同类之间最大程度地分离的基向量来执行降维。这基本上是在执行有监督的降维。您正在使用的工具箱支持 LDA,因此请尝试使用它并查看您获得的性能。从 LDA 获得的基向量与 PCA 的操作相同,因此除了将标志从 PCA 更改为 LDA 之外,几乎没有代码更改。
    猜你喜欢
    • 2013-12-31
    • 2019-07-21
    • 2018-04-15
    • 2021-04-04
    • 2018-01-28
    • 2017-08-05
    • 2013-03-06
    • 2013-03-03
    • 2015-02-28
    相关资源
    最近更新 更多