本文对CNN不同层次的特征进行了主成分分析。我已经从这里下载了降维工具箱。
我一共有11232张训练图像,每幅图像的特征是6532张。因此,特征矩阵类似于11232x6532,如果我想得到前90%的特征,我可以很容易地做到这一点,并且使用支持向量机对减少的数据进行训练的准确率为81.73%,这是公平的。然而,当我尝试测试数据,其中有2408图像和特征的每幅图像是6532。因此,用于测试数据的特征矩阵是2408x6532。在这种情况下,顶部90%的特性的输出是不正确的,它显示了2408x2408。测试精度为25%。不进行降维训练,训练准确率为82.17%,测试准确率为79%。
更新:,其中X是数据,而no_dims是输出时所需的维数。该主元分析函数的输出是可变的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;发布于 2018-03-19 05:35:20
看起来你是在对训练数据和测试数据分别进行降维。在训练过程中,你应该记住训练中的主要分数或基本向量。请记住,您正在根据培训数据找到一组新的正交轴来表示您的数据。在测试期间,您重复与训练数据完全相同的过程,就像表示这些基本向量的数据一样。因此,您可以使用训练数据的基向量来减少数据的下降。您只得到一个2408 x 2408矩阵,因为您正在测试示例上执行主成分分析,因为不可能产生超过所述矩阵的秩的基向量(即2408)。
从训练阶段保留你的基向量,当在测试阶段进行分类时,你必须从训练阶段使用相同的基向量。记住,在PCA中,您必须在降维之前通过执行均值减法来对数据进行中心化。为此,在您的代码中,我们注意到基向量存储在mapping.M中,相关的平均向量存储在mapping.mean中。当涉及到测试阶段时,请确保您的意思是使用mapping.mean从培训阶段减去测试数据:
Y = bsxfun(@minus, Feature_test, mapping.mean);一旦你有了这个,最后继续,维度减少你的数据:
mappedX_test = Y * mapping.M;https://stackoverflow.com/questions/49355404
复制相似问题