PCA 原理 一、什么是PCAhttps://www.bilibili.com/video/BV1E5411E71z/?spm_id_from333.337.search-card.all.clickvd_source52997da921a43b4ed3611981bbdf91a4PCA 在最小二乘意义下找到数据方差最大的正交方向在点云里最大特征值方向 → 主方向最小特征值方向 → 法向量二、数学推导1、问题定义2、去中心化非常关键均值去中心数据3、方差最大化建模拉伸拉伸的方向就是方差最大的方向拉伸的方向就是方差最大的方向拉伸的方向就是方差最大的方向旋转旋转决定了方差最大的方向的角度旋转决定了方差最大的方向的角度旋转决定了方差最大的方向的角度计算R旋转矩阵协方差矩阵的特征向量就是旋转矩阵R协方差矩阵的特征向量就是旋转矩阵R协方差矩阵的特征向量就是旋转矩阵R协方差矩阵计算协方差协方差的特征向量4、约束优化问题5、 拉格朗日乘子法结论PCA 协方差矩阵的特征值分解6、结论总结特征值几何意义最大特征值最大方差方向主方向最小特征值垂直数据分布方向法向7、求截图8、PCA与标准圆、置信椭圆实例三、PCA 与点云法向量的关系对局部点云邻域点近似落在一个平面法向量 最小特征值对应的特征向量https://blog.csdn.net/weixin_39354845/article/details/157579276?sharetypeblogdetailsharerId157579276sharereferPCsharesourceweixin_39354845spm1011.2480.3001.8118这是点到平面最小二乘的解。四、MATLAB 示例示例12D PCA直观理解clc; clear; close all; % 生成带噪声的直线数据 x linspace(-5,5,100); y 2*x randn(1,100); X [x; y]; % 去中心 mu mean(X,2); Xc X - mu; % 协方差矩阵 C (Xc*Xc)/size(Xc,2); % 特征分解 [V,D] eig(C); % 按特征值排序 [d,idx] sort(diag(D),descend); V V(:,idx); % 画图 figure; hold on; axis equal; grid on; scatter(X(1,:),X(2,:),20,b,filled); quiver(mu(1),mu(2),V(1,1),V(2,1),5,r,LineWidth,2); quiver(mu(1),mu(2),V(1,2),V(2,2),5,g,LineWidth,2); legend(Data,1st PC,2nd PC); title(2D PCA Principal Directions);示例 23D 点云 PCA 法向估计创建一个平面点云clear; clc; close all; %% 1. 生成示例点云平面 噪声 N 500; X rand(N,1)*2 - 1; Y rand(N,1)*2 - 1; Z 0.2*X 0.1*Y 0.02*randn(N,1); % 平面 少量噪声 pts [X Y Z]; %% 2. 可视化原始点云 figure; scatter3(X,Y,Z,8,Z,filled); title(原始点云); axis equal; grid on; hold on;特征值分解% 构建KD树用于最近邻查询MATLAB 2019 支持 k 20; % 邻域点数量 Mdl KDTreeSearcher(pts); % 对每个点计算 PCA 法向 normals zeros(N,3); for i 1:N % 查找最近邻 idx knnsearch(Mdl, pts(i,:), K, k); nbrs pts(idx,:); % 求均值 mean_p mean(nbrs,1); % 去均值 Q nbrs - mean_p; % 构造协方差矩阵 C (Q * Q) / k; % eigen 分解 [V,D] eig(C); % 最小特征值对应的特征向量 [~, id] min(diag(D)); n V(:,id); normals(i,:) n; end可视化 PCA 法向结果step 10; % 每隔一定数量画一个法向 quiver3(pts(1:step:end,1), ... pts(1:step:end,2), ... pts(1:step:end,3), ... normals(1:step:end,1), ... normals(1:step:end,2), ... normals(1:step:end,3), ... 0.3, r, LineWidth, 1.5); title(PCA 估计的点云法向量); xlabel(X); ylabel(Y); zlabel(Z); hold off;结果示例 33D 点云 PCA 法向估计兔子读入点云clear; clc; close all; %% 1. 读取点云 filename bun000.ply; % 或者dragon_vrip_res3.ply ptCloud pcread(filename); pts ptCloud.Location; N size(pts,1); fprintf(Loaded %d points from %s\n, N, filename); %% 2. 显示原始点云 figure; pcshow(ptCloud, MarkerSize, 20); title(原始点云); axis equal; hold on;构建KD treek 50; % 邻域大小真实点云需稍大 Mdl KDTreeSearcher(pts);特征值分解normals zeros(N, 3); % PCA 法向估计 for i 1:N idx knnsearch(Mdl, pts(i,:), K, k); nbrs pts(idx, :); % 均值 mean_p mean(nbrs); % 协方差矩阵 Q nbrs - mean_p; C (Q * Q) / k; % PCA -很重要 [V, D] eig(C); % 最小特征值对应的特征向量 [~, id] min(diag(D)); n V(:, id); normals(i,:) n; end法向统一朝外避免翻转% 使用点云中心 center mean(pts); for i 1:N v pts(i,:) - center; if dot(normals(i,:), v) 0 normals(i,:) -normals(i,:); end endcode五、PCA 的工程注意点1️⃣ 邻域大小敏感小噪声大大细节丢失曲率 特征值比例2️⃣ 法向方向不唯一n和−n等价工程中通常朝向视点或保持一致性传播3️⃣ PCA vs 积分图法向RGB-D方法特点PCA (KDTree)精度高慢Integral Image快受深度噪声影响六、为什么 PCA 最小特征值是法向数学协方差矩阵特征分解为什么最小特征值对应法向几何直觉局部点集近似平面平面上有两个主方向 → 点分布方差大垂直于平面的方向 → 点分布最紧密 → 方差最小数学上取最小 Var(v) → 找到方差最小的方向这就是垂直于点云平面的方向 → 法向量Matlab 显示点云%% ------------------------------- % PCA 法向直观可视化 % ------------------------------- clear; clc; close all; %% 1. 生成模拟局部点云近似平面 N 100; X randn(N,1); Y randn(N,1); Z 0.05*randn(N,1); % Z 方向方差很小模拟平面 pts [X Y Z]; % 中心化 p_mean mean(pts,1); Q pts - p_mean; %% 2. 协方差矩阵 C (Q*Q)/N; %% 3. 特征分解 [V,D] eig(C); [lambda, idx] sort(diag(D),ascend); % 升序 V V(:,idx); % 法向量 n V(:,1); % 最小特征值方向 v2 V(:,2); % 次主方向 v3 V(:,3); % 最大方差方向 %% 4. 绘制点云 figure; hold on; axis equal; grid on; scatter3(pts(:,1), pts(:,2), pts(:,3), 30, b, filled);计算法向量显示%% 5. 绘制 PCA 特征轴红绿色蓝 scale 0.5; quiver3(p_mean(1), p_mean(2), p_mean(3), ... n(1)*scale, n(2)*scale, n(3)*scale, ... r,LineWidth,2,MaxHeadSize,2); % 法向最小特征值 quiver3(p_mean(1), p_mean(2), p_mean(3), ... v2(1)*scale, v2(2)*scale, v2(3)*scale, ... g,LineWidth,2,MaxHeadSize,2); % 次主方向 quiver3(p_mean(1), p_mean(2), p_mean(3), ... v3(1)*scale, v3(2)*scale, v3(3)*scale, ... b,LineWidth,2,MaxHeadSize,2); % 最大方差方向 %% 6. 图形美化 title(PCA 法向与特征轴可视化); legend(局部点云,法向 n (最小特征值),次主方向,最大方差方向); xlabel(X); ylabel(Y); zlabel(Z); view(45,30);七、PCA的缺点以及SVD的区别缺点与SVD的区别