首页 文章

PCA尺寸缩减用于分类

提问于
浏览
3

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

我总共有11232个训练图像,每个图像的特征是6532.所以特征矩阵就像 11232x6532 如果我想要90%的顶级特征我可以很容易地做到这一点,使用SVM减少数据的训练精度是81.73%这是公平的 . 但是,当我尝试具有2408个图像的测试数据时,每个图像的特征是6532.因此用于测试数据的特征矩阵是 2408x6532 . 在这种情况下,前90%功能的输出不正确,显示 2408x2408 . 测试精度为25% . 不使用降维,训练精度为82.17%,测试精度为79% .
Update: 其中 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;

1 回答

  • 5

    看起来你应该在训练期间记住这些例子的主要分数或基础向量 . 请记住,您正在根据训练数据使用一组新的正交轴找到数据的新表示 . 在测试期间,您将重复与训练数据完全相同的过程,因为您要表示与这些基础向量相关的数据 . 因此,您可以使用 training data 的基础向量来减少数据 . 您只获得一个 2408 x 2408 矩阵,因为您在测试示例上执行PCA,因为无法生成超出所讨论矩阵等级的基础向量(即2408) .

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

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

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

    mappedX_test = Y * mapping.M;
    

相关问题