Add*_*dee 3 matlab machine-learning computer-vision pca dimensionality-reduction
我正在对从CNN的不同层提取的特征使用主成分分析.我从这里下载了降维工具箱.
我总共有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;
Run Code Online (Sandbox Code Playgroud)
根据你的建议.我已经计算了训练数据的向量.
numberOfDimensions = round(0.9*size(Feature,2));
[mapped_data, mapping] = compute_mapping(Feature, 'PCA', numberOfDimensions);
Run Code Online (Sandbox Code Playgroud)
然后使用相同的向量来测试数据:
mappedX_test = Feature_test * mapping.M;
Run Code Online (Sandbox Code Playgroud)
精度仍为32%
通过减法解决:
Y = bsxfun(@minus, Feature_test, mapping.mean);
mappedX_test = Y * mapping.M;
Run Code Online (Sandbox Code Playgroud)
看起来您正在分别对训练和测试数据进行降维.在训练期间,您应该记住训练期间示例的主要分数或基础向量.请记住,您正在根据训练数据使用一组新的正交轴找到数据的新表示.在测试期间,您将重复与训练数据完全相同的过程,因为您要表示与这些基础向量相关的数据.因此,您可以使用训练数据的基础向量来减少数据.您只获得一个2408 x 2408矩阵,因为您在测试示例上执行PCA,因为无法生成超出相关矩阵等级的基础向量(即2408).
保留训练阶段的基础向量,当在测试阶段进行分类时,必须使用训练阶段的相同基础向量.请记住,在PCA中,您必须通过在降维前执行平均减法来居中数据.为此,在您的代码中我们注意到存储了基础向量,并且存储mapping.M了相关的平均向量mapping.mean.在测试阶段,确保您的意思是mapping.mean从训练阶段中减去测试数据:
Y = bsxfun(@minus, Feature_test, mapping.mean);
Run Code Online (Sandbox Code Playgroud)
一旦你有了这个,最后继续维度减少你的数据:
mappedX_test = Y * mapping.M;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |