0

我想为数据集计算一个通用 PCA 矩阵,我将使用它来减少筛选描述符的维度。我已经找到了一些算法来计算它,但是我找不到使用 MATLAB 来计算它的方法。

有人能帮我吗?

4

2 回答 2

1

如果您有权访问 Statistics Toolbox,则可以使用 command princomp,或者在最近的版本中使用 command pca

于 2013-08-06T13:17:32.927 回答
1
[coeff, score] = princomp(X) 

是正确的做法,但知道如何使用它有点棘手。


我的理解是你做了类似的事情:

sift_image = sift_fun(img)

这给了你一个二进制图像:sift_feature?(即使不是二进制的,这仍然有效。)

输入,制定 X:

使用princomp/pca公式化 X 使得每列都是numel(sift_image)x 1 向量
(即sift_image(:)
对所有图像执行此操作并将它们排列为 X 中的列。
所以 X 将是numel(sift_image)x num_images。

如果您的图像大小不同(例如像素尺寸不同,图像中或多或少的场景),那么您需要将它们带到某个公共空间,这是一个完全不同的问题。

除非你的东西是二进制的,否则你可能想要在列方向(即对每个单独的图像进行归一化)和行方向(对整个数据集进行去意义)进行去均值/归一化。

输出

score是特征向量的集合:它将是 num_pixels * num_images。要让第一个特征向量回到图像形状,请执行以下操作:

first_component = reshape(score(:,1),size(im));

其余的组件依此类推。有与输入图像一样多的组件。

的每一行coeff是 num_images(等于 num_components)组可用于生成每个输入图像的权重。IE

input_image_1 = reshape(score * coeff(:,1) , size(original_im));

其中 input_image_1 是正确的,原始形状
coeff(1,:) 是向量 (num_images x 1)
分数是像素 x num_images
(免责声明:我可能将列/行混淆,但描述是正确的。)

这有帮助吗?

于 2013-08-06T16:55:55.107 回答