我想为数据集计算一个通用 PCA 矩阵,我将使用它来减少筛选描述符的维度。我已经找到了一些算法来计算它,但是我找不到使用 MATLAB 来计算它的方法。
有人能帮我吗?
如果您有权访问 Statistics Toolbox,则可以使用 command princomp
,或者在最近的版本中使用 command pca
。
[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
(免责声明:我可能将列/行混淆,但描述是正确的。)
这有帮助吗?