我想为数据集计算一般PCA矩阵,我将使用它来减少筛选描述符的维度。我已经找到了一些算法来计算它,但我找不到使用MATLAB计算它的方法。
有人能帮助我吗?
答案 0 :(得分:1)
如果您可以访问Statistics Toolbox,则可以使用命令princomp
,或者在最新版本中使用命令pca
。
答案 1 :(得分: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。
如果您的图像尺寸不同(例如像素尺寸不同,图像中的场景或多或少),那么您需要将它们带入一些公共空间,这是一个完全不同的问题。
除非你的东西是二进制的,否则你可能想要在列方向(即规范化每个单独的图像)和行方向(取决于整个数据集)中对X进行去均值/归一化。
输出
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
(免责声明:我可能会将列/行混合在一起,但描述是正确的。)
这有帮助吗?