我正在使用主成分分析(PCA)处理从不同CNN层中提取的特征。我已经从这里下载了降维工具箱。
我有11232张训练图像,每个图像的特征是6532。所以特征矩阵如下:
如果不使用降维方法,训练准确率为82.17%,测试准确率为79%。
更新: 其中
我有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;