在 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
我有一张图片。我需要确定图像方差最小的轴。一些阅读和搜索让我得出结论,主成分分析 (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