【发布时间】:2013-08-07 12:23:06
【问题描述】:
我想为一个数据集计算一个通用的 PCA 矩阵,我将使用它来减少筛选描述符的维度。我已经找到了一些算法来计算它,但是我找不到使用 MATLAB 来计算它的方法。
有人可以帮助我吗?
【问题讨论】:
我想为一个数据集计算一个通用的 PCA 矩阵,我将使用它来减少筛选描述符的维度。我已经找到了一些算法来计算它,但是我找不到使用 MATLAB 来计算它的方法。
有人可以帮助我吗?
【问题讨论】:
如果您有权访问 Statistics Toolbox,则可以使用命令 princomp,或者在最近的版本中使用命令 pca。
【讨论】:
n 对象,您已经收集了 p 变量,并且您将 p 变量减少到 q,其中 q<<p。也许你有n 图像,每个都测量了p 筛选描述符?或者,也许您有一个带有n 感兴趣区域的图像,每个图像都有p 描述符?
[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)组可用于生成每个输入图像的权重。即
input_image_1 = reshape(score * coeff(:,1) , size(original_im));
input_image_1 是正确的原始形状
coeff(1,:) 是一个向量 (num_images x 1)
分数是像素 x num_images
(免责声明:我可能混淆了列/行,但描述是正确的。)
这有帮助吗?
【讨论】: