在 Matlab 中使用主成分分析 (PCA) 计算和绘制主成分

Calculating and Plotting Principal Components using Principal Component Analysis (PCA) in Matlab

我有一张图片。我需要确定图像方差最小的轴。一些阅读和搜索让我得出结论,主成分分析 (PCA) 是最好的选择。谁能帮我根据主轴定位图像?由于我最近被介绍给 matlab,我发现它有点困难。图像示例如下。我正在尝试旋转图像以便生成直方图。

我还没有用过PCA,我现在的代码如下图

enter code here
I2='image'
I11= bwlabel(I2);
OBB = imOrientedBox(I11);
obbsize=[];
for i=1:size(OBB,1)
   obbsize=[obbsize,OBB(i,3)*OBB(i,4)];
end
[a,i]=max(obbsize);
I11=(imrotate(I2,OBB(i,5)));
imshow(I11,[])

[pks,locs] =findpeaks(sum(I11,2));
[M1,Indx1] = max(pks);
imshow(I11(1:locs(Indx1),1:size(I11,2)),[])

使用构建您的 PCA 转换矩阵。 C 是您的变换或旋转矩阵,会将其变换到最高方差方向。

[C,~,~,~,explained] = pca( data );

如果您想截断组件(例如 1-5 个组件),请删除 PC。如果您不需要 truncate/reduce 尺寸,请忽略此步骤。

C = C(:,1:5);

使用转换 C 创建转换后的数据。数据现在将在新转换的 space 中,第一个 维度是 最大 方差,第二个 dim 是 第二大 方差,等等。因为您正在寻找 最小方差 ,那是 最后维度

tfData = data * C;

在此新转换的 space 中相应地处理您的数据。要获得您的逆变换并将其恢复为原始 space,请使用以下命令。

origAxisData = tfData * C';

转置操作C'与逆变换的逆操作inv(C)相同,因为它是正交的as described here。然而,转置的计算速度比逆运算快得多,尤其是对于高维度。

您可以通过如下绘制 C 的列来绘制您的主体 component/axes/kernel。

for i = 1:length(end)
    figure; plot( C(:,1) );
end