使用PCA拟合平面

article/2025/10/13 17:52:52

PCA原理&使用PCA拟合平面

  • 背景
  • 三点确定一平面
  • 多点拟合平面
    • 基础数学知识
    • PCA基本思想
    • PCA拟合平面计算过程
  • PCA理解
    • 中心化
    • 协方差对角化

背景

本文参考以下两篇平面解析的论文。
《Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clustering》2014 ICRA
《Fast Cylinder and Plane Extraction from Depth Cameras for Visual Odometry》2018 IROS

这两篇论文在为数不多的平面解析中都取得了较好的效果,并且均开源。本文不详细解析论文本身的方法,而是简单的分析代码是如何使用PCA这种方法来拟合平面的。

三点确定一平面

还是回顾一下基础。

平面方程可以由下列两种方式表示。
Ax+By+Cz+D=0 截距式
A(x-x0)+B(y-y0)+C(z-z0)=0 点法式

其中,A、B、C组成的向量为平面的法向量。

为啥呢?

因为平面法向量垂直于平面任何向量,有 :平面法向量 点乘· 平面向量 = 0 ,对应着 A ( x − x 0 ) + B ( y − y 0 ) + C ( z − z 0 ) = 0 A(x-x0)+B(y-y0)+C(z-z0)=0 A(xx0)+B(yy0)+C(zz0)=0
故A,B,C组成的向量为平面法向量。

我们知道,三点可以确定一个平面。假如我们有三个空间点:
P 0 = ( x 0 , y 0 , z 0 ) , P 1 = ( x 1 , y 1 , z 1 ) , P 2 = ( x 2 , y 2 , z 2 ) P_0 = (x_0,y_0,z_0) ,P_1 =(x_1,y_1,z_1),P_2 = (x_2,y_2,z_2) P0=(x0,y0,z0)P1=(x1,y1,z1)P2=(x2,y2,z2)
P 0 P_0 P0为中心点得到两平面向量:
V 0 = P 1 − P 0 , V 1 = P 2 − P 0 V_0=P_1-P_0,V_1=P_2-P_0 V0=P1P0,V1=P2P0

平面法向量为: n = V 1 × V 2 n=V_1 × V_2 n=V1×V2

即上面所说的(A,B,C)。

多点拟合平面

基础数学知识

协方差:
C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E ( Y ) ) ] = E [ X Y ] − 2 E [ Y ] [ X ] + E [ X ] E [ Y ] = E [ X Y ] − E [ X ] E [ Y ] \begin{aligned} Cov(X,Y) &=E[(X-E[X])(Y-E(Y))] \\ &=E[XY]-2E[Y][X]+E[X]E[Y] \\ &=E[XY]-E[X]E[Y]\end{aligned} Cov(X,Y)=E[(XE[X])(YE(Y))]=E[XY]2E[Y][X]+E[X]E[Y]=E[XY]E[X]E[Y]
协方差矩阵,可描述不同变量关系的矩阵。对角元素是自身的方差,非对角元素是某变量与另一变量的协方差。
C = ( c i j ) n × n = ( c 11 c 12 ⋯ c 1 n c 21 c 22 ⋯ c 2 n ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ c n 1 c n 2 … c n n ) C=\left(c_{i j}\right)_{n \times n}=\left(\begin{array}{cccc}c_{11} & c_{12} & \cdots & c_{1 n} \\ c_{21} & c_{22} & \cdots & c_{2 n} \\ \cdot & \cdot & & \cdot \\ \cdot & \cdot & & \cdot \\ \cdot & \cdot & & \cdot \\ c_{n 1} & c_{n 2} & \ldots & c_{n n}\end{array}\right) C=(cij)n×n=c11c21cn1c12c22cn2c1nc2ncnn

其中 c i j c_ij cij为协方差,当i=j时,为方差(对角)。

PCA基本思想

  • 将坐标轴中心移到数据的中心(中心化),然后旋转坐标轴,使得数据在C1轴上的方差最大,即全部n个数据个体在该方向上的投影最为分散。意味着更多的信息被保留下来。C1成为第一主成分。
  • C2第二主成分:找一个C2,使得C2与C1的协方差(相关系数)为0,以免与C1信息重叠,并且使数据在该方向的方差尽量最大。
  • 以此类推,找到第三主成分,第四主成分。。。。第p个主成分。p个随机变量可以有p个主成分。

PCA拟合平面计算过程

在这里插入图片描述

我们知道,在三维空间中,空间点的维度为3,要确定一个平面,等同于确定其法向量(三维)。

按照上面PCA的定义,我们同样对三维空间点进行PCA算法操作。
假设当前点数量为N,于是我们拥有N×3个三维空间点。

1.对于三维空间点的数据,先将其均值中心化(mean centering):
(下图为一个二维中心化例子)
在这里插入图片描述 2.然后我们计算所有点在x、y、z轴的均值、方差、协方差、协方差矩阵。
计算公式:

X ^ = ∑ i = 0 N X i N , Y ^ = ∑ i = 0 N Y i N , Z ^ = ∑ i = 0 N Z i N \hat{X}=\frac{\sum_{i=0}^{N} X_i}{N},\hat{Y}=\frac{\sum_{i=0}^{N} Y_i}{N},\hat{Z}=\frac{\sum_{i=0}^{N} Z_i}{N} X^=Ni=0NXi,Y^=Ni=0NYi,Z^=Ni=0NZi
V a r ( X , X ) = ∑ i = 1 N ( x i − X ^ ) 2 n Var(X,X)=\frac{\sum_{i=1}^{N}\left(x_{i}-\hat{X}\right)^{2}}{n} Var(X,X)=ni=1N(xiX^)2
Y,Z方差同理。
C o v ( X , Y ) = ∑ i = 1 N ( x i − X ^ ) ( y i − Y ^ ) n Cov(X,Y)=\frac{\sum_{i=1}^{N}(x_{i}-\hat{X})(y_i-\hat{Y})}{n} Cov(X,Y)=ni=1N(xiX^)(yiY^)
X、Z的协方差与Y、Z的协方差同理。
最终得到的协方差矩阵为3维。

3.计算协方差矩阵特征值与特征向量。
这里就不详细说矩阵的特征值和特征向量是怎么求得了。然后取排名前二特征值对应的特征向量,两特征向量代表着方差较大的基,使两特征向量叉乘,即可得到我们要求的拟合好的平面法向量。

看下图,你会发现最大特征值对应的特征向量方向的点和第二大特征值对应的特征向量方向的点方差较第三大特征值对应的特征向量的点方差大。
在这里插入图片描述
从图中,我们应该很好理解,为什么要取前两大特征值的叉乘来获取拟合平面的法向量。实际上我们也可以直接拿最小特征值对应的特征向量来作为平面的法向量。

到这里,我们就基本讲清楚PCA算法的计算步骤,你以为这就完了么?还没,我还没有讲清楚其基本原理,为什么需要中心化?为什么PCA会和协方差矩阵扯上关系?为什么最大特征值对应的特征向量就能代表方差最大的维度?

PCA理解

中心化

我们知道,计算方差和协方差时,需要用到以下公式:
V a r ( X , X ) = ∑ i = 1 N ( x i − X ^ ) 2 n Var(X,X)=\frac{\sum_{i=1}^{N}\left(x_{i}-\hat{X}\right)^{2}}{n} Var(X,X)=ni=1N(xiX^)2
C o v ( X , Y ) = ∑ i = 1 N ( x i − X ^ ) ( y i − Y ^ ) n Cov(X,Y)=\frac{\sum_{i=1}^{N}(x_{i}-\hat{X})(y_i-\hat{Y})}{n} Cov(X,Y)=ni=1N(xiX^)(yiY^)

假设点集为 P P P,中心化即:

P c e n t e r = P − P ^ P_{center}=P-\hat{P} Pcenter=PP^

其中 P ^ \hat{P} P^为三个轴的均值组成的向量。

中心化之后,点集各个轴均值为0,则有以下:

V a r ( X , X ) = ∑ i = 1 N ( x i − 0 ) 2 n = ∑ i = 1 N x i 2 n Var(X,X)=\frac{\sum_{i=1}^{N}\left(x_{i}-0\right)^{2}}{n}=\frac{\sum_{i=1}^{N}x_{i}^{2}}{n} Var(X,X)=ni=1N(xi0)2=ni=1Nxi2
C o v ( X , Y ) = ∑ i = 1 N ( x i − 0 ) ( y i − 0 ) n = ∑ i = 1 N x i y i n Cov(X,Y)=\frac{\sum_{i=1}^{N}(x_{i}-0)(y_i-0)}{n}=\frac{\sum_{i=1}^{N}x_{i}y_i}{n} Cov(X,Y)=ni=1N(xi0)(yi0)=ni=1Nxiyi

方便后续计算。

假设有N个三维点,将所有三维点写为3×N的矩阵,有:
A = ( x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 . . . . . . . . . ) A = \begin{pmatrix} x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \\ x_3 & y_3 & z_3 \\ ... & ... & ... \end{pmatrix} A=x1x2x3...y1y2y3...z1z2z3...

其协方差矩阵可简单地表示为:
C = 1 N ⋅ ( x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 . . . . . . . . . ) T ⋅ ( x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 . . . . . . . . . ) = 1 N A T A C = \frac{1}{N} \cdot \begin{pmatrix} x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \\ x_3 & y_3 & z_3 \\ ... & ... & ... \end{pmatrix}^T \cdot \begin{pmatrix} x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \\ x_3 & y_3 & z_3 \\ ... & ... & ... \end{pmatrix} = \frac{1}{N}A^TA C=N1x1x2x3...y1y2y3...z1z2z3...Tx1x2x3...y1y2y3...z1z2z3...=N1ATA

协方差对角化

目前采用的基底为:
( 1 0 0 0 1 0 0 0 1 ) \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 &0 & 1 \end{pmatrix} 100010001

协方差矩阵为:
( 1 N ∑ x i 2 1 N ∑ x i y i 1 N ∑ x i z i 1 N ∑ x i y i 1 N ∑ y i 2 1 N ∑ y i z i 1 N ∑ x i z i 1 N ∑ y i z i 1 N ∑ z i 2 ) \begin{pmatrix} \frac{1}{N}\sum x_i^2 & \frac{1}{N}\sum x_iy_i & \frac{1}{N}\sum x_iz_i \\ \frac{1}{N}\sum x_iy_i & \frac{1}{N}\sum y_i^2 & \frac{1}{N}\sum y_iz_i \\ \frac{1}{N}\sum x_iz_i &\frac{1}{N}\sum y_iz_i & \frac{1}{N}\sum z_i^2 \end{pmatrix} N1xi2N1xiyiN1xiziN1xiyiN1yi2N1yiziN1xiziN1yiziN1zi2

协方差矩阵未必是对角阵,也就是说,在这个基下点的各个轴的分布是相关的(非对角元素不为0)。

正是由于在当前基数据的分布在各个轴(基)协方差不为0,数据的方差没有达到最大,很自然地我们会想到,需要一个新的基底,使得点在新基底的分布在各个轴的分布无关,这个时候,数据的协方差矩阵为对角阵。即各个轴对应的协方差为0。于是,我们就需要把协方差对角化。

点集为 A A A,设新的基底为 K K K,则点集 A A A在新基底的坐标为: A K AK AK,于是新的协方差矩阵为:
D = 1 N ( A K ) T ( A K ) = 1 N K T A T A K = K T C K D=\frac{1}{N}(AK)^T(AK)=\frac{1}{N}K^TA^TAK=K^TCK D=N1(AK)T(AK)=N1KTATAK=KTCK
D D D为新的协方差矩阵,且为对角阵。

其中,新的基底K其实就是特征向量,对角阵协方差矩阵D中的各个元素就是特征值。
协方差矩阵中的对角元素,意味着各个基方向数据分布的方差,特征值=方差,特征值越大=方差越大。

而大的特征值对应的特征向量,对应着就是方差大的基/特征方向。

总的来说,特征向量就是新的正交坐标轴,特征值就是所有数据投影到对应特征向量的方差。

在拟合平面这个任务中,其实就是希望找到一个法向量方向,使得所有点投影到这个方向上的方差最小,我们取最小特征值对应的基向量就可以了,而PCA是最大方差理论,原则上这个不属于PCA,但从另一个角度讲,我们可以先提取特征较大的两个基向量,然后使两者叉乘得到平面的法向量,从这个角度讲,这也算是一种PCA的方法,只是需要进行后处理。

参考:
https://stats.stackexchange.com/questions/22329/how-does-centering-the-data-get-rid-of-the-intercept-in-regression-and-pca
https://en.wikipedia.org/wiki/Principal_component_analysis
《Fast Plane Extraction in Organized Point Clouds Using Agglomerative Hierarchical Clustering》
《Fast Cylinder and Plane Extraction from Depth Cameras for Visual Odometry》


http://chatgpt.dhexx.cn/article/OROvJrqG.shtml

相关文章

Dynamic inner PCA 和 Dynamic PCA

动态PCA方法的核心思想: 将数据X变成增广矩阵,即: l为潜在变量数,然后对X进行传统的PCA方法进行求解,即是动态PCA的结果。 动态内模PCA与之不同,上述动态PCA的一大缺陷是增加了数据的维度,而动…

python实现PCA

★ PCA个人理解: PCA降维是通过变换坐标系,来尽可能的减少信息损失。 ★ PCA思路: 我们的初始矩阵为X,它是mn维的矩阵,其中:m是该数据集有m条记录,n是每条记录中有n个特征,X的基本格…

PCA降维算法

目录 1.维度1.1数据维度1.2特征维度 2.sklearn中的降维算法2.1PCA与SVD2.2降维的实现2.3重要参数n_components2.3.1最大似然估计自选超参数2.3.2 按信息量占比选超参数 3.PCA中的SVD3.1重要参数svd_solver 与 random_state3.2重要属性components_3.3重要接口inverse_transform …

PCA降维

一、主成分分析 1、动机:多个变量之间往往存在一定的相关性,可以通过线性组合的方式从中提取信息。 2、主成分分析:将原始的n维数据投影到低维空间,并尽可能的保留更多的信息。 ---投影后方差最大 ---最小化重构误差 从而达到…

pca绘图

pca 1 PCAtools 1.1 加载R包 library(PCAtools) library(tidyverse)1.2 加载数据&#xff0c;构建表达矩阵和分组信息&#xff08;以iris为例&#xff09; iris <- as.data.frame(iris) iris <- iris %>% mutate(class str_c("a",1:dim(iris)[1],sep …

PCA算法详解

文章出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c;所以记…

PCA 算法详解

PCA算法步骤&#xff1a; 设有m条n维数据。 1&#xff09;将原始数据按列组成n行m列矩阵X 2&#xff09;将X的每一行&#xff08;代表一个属性字段&#xff09;进行零均值化&#xff0c;即减去这一行的均值 3&#xff09;求出协方差矩阵 4&#xff09;求出协方差矩阵的特征值及…

PCA原理

PCA 各位&#xff0c;久违了&#xff5e; 什么是PCA&#xff1f; 什么是PCA呢&#xff1f;这是一个问题&#xff0c;什么样的问题&#xff1f;简单而又复杂的问题&#xff0c;简单是因为百度一下就会出现一大堆的解释&#xff0c;复杂是因为它里面蕴含的内容还是很多的&…

python实现PCA降维

本文包括两部分&#xff0c;使用python实现PCA代码及使用sklearn库实现PCA降维&#xff0c;不涉及原理。 总的来说&#xff0c;对n维的数据进行PCA降维达到k维就是&#xff1a; 对原始数据减均值进行归一化处理&#xff1b;求协方差矩阵&#xff1b;求协方差矩阵的特征值和对…

PCA算法

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。 参考&#xff1a;http://www.cnblogs.com/pinard/p/6239403.html PCA的思想 PCA顾名思义&#xff0c;就是找出数据里最主要的方面&#xff0c;用数据里最…

PCA

R语言实现PCA 一次来自男神MR.来的作业PCA读取数据PCA主体部分输出PCA的主要结果&#xff0c;列出主成分分析分析结果利用碎石图来展示PCA结果对component进行一些解释 简略分析利用PCA结果来进行一个排序下面进行聚类分析 一次来自男神MR.来的作业 PCA 读取数据 #读取数据&…

主成分分析(PCA)原理详解

转载请声明出处&#xff1a;http://blog.csdn.net/zhongkelee/article/details/44064401 一、PCA简介 1. 相关背景 上完陈恩红老师的《机器学习与知识发现》和季海波老师的《矩阵代数》两门课之后&#xff0c;颇有体会。最近在做主成分分析和奇异值分解方面的项目&#xff0c…

PCA详解

本文目录 一、来源及作用存在问题基本作用 二、 基本原理及求解步骤核心思想如何选择投影方向 三、原理分析最大投影方差最小重构代价 四、SVD与PCA的关系 一、来源及作用 存在问题 在我们训练模型的过程中&#xff0c;有时会出现在训练集上误差较小&#xff0c;但到了测试集误…

主成分分析法(PCA)

主成分分析&#xff08;Principal components analysis&#xff0c;以下简称PCA&#xff09;是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA&#xff0c;下面我们就对PCA的原理做一个总结。 目录 …

主成分分析(PCA)方法步骤以及代码详解

主成分分析&#xff08;PCA&#xff09;方法步骤以及代码详解 前言 上一节我们了解到在构建神经网络模型&#xff0c;除了掌握如何搭建神经网络架构&#xff0c;了解参数具体含义&#xff0c;规避风险等方法。第一步是要对采用数据集的详细了解&#xff0c;无需接触任何神经网…

机器学习——PCA降维(我至今为止遇见的最好的博文)

参考文章&#xff1a;https://zhuanlan.zhihu.com/p/77151308 PCA&#xff08;Principal Component Analysis&#xff09; 是一种常见的数据分析方式&#xff0c;常用于高维数据的降维&#xff0c;可用于提取数据的主要特征分量。 PCA 的数学推导可以从最大可分型和最大重构性…

通达OA工作流数据报表二次开发版

此模块除具备工作流——数据报表所有功能外&#xff0c;新加入的功能包括&#xff1a; 1&#xff1a;查询条件自带可查询未完成的流程&#xff1b; 2&#xff1a;查询条件可设置查询所有子流程的字段&#xff1b; 3&#xff1a;报表可显示流程当前处理人&#xff0c;并且点击每…

开发通达OA工作流接口从ERP自动生成OA请款单(图文)

ERP系统很多不带审批系统&#xff0c;即使有审批系统的话应用起来也不那么容易&#xff0c;因为领导一般都是不使用ERP系统的&#xff0c;那么我就用通达OA来完成ERP的单据审批吧&#xff0c;是不是很酷呢&#xff0c;而且还支持移动端app和微信审批。 ERP端的数据发起由ERP方…

OA工作流引擎:作为组织血脉支撑的重要性解析

前面提到协同OA管理平台是以“人和事”为管理对象&#xff0c;但如何把“人和事”通过一定的方法能全部贯通起来呢。就如同一个人&#xff0c;有手、脚、嘴、头脑等各种器官&#xff0c;但如何能把这些器官充分的调动起来&#xff0c;里面最核心的还是人的血液&#xff0c;OA系…

通达OA 工作流运行异常情况的紧急处理(图文)

本文整理自通达OA技术交流群&#xff08;QQ群号&#xff1a;378591362&#xff09;群友交流内容。 一位朋友的工作流设计和运行突然出现故障&#xff0c;显示的数据部分都不正常&#xff0c;如下图&#xff1a; 经过重启所有服务&#xff08;包括缓存服务&#xff09;现象依旧。…