奇异值分解(SVD)拟合平面

news/2025/2/25 6:36:03/

SVD_0">奇异值分解(SVD)拟合平面

在三维空间中,使用奇异值分解(SVD)来拟合平面是一种常见且有效的方法。下面将详细介绍其原理、实现步骤,并给出Python代码示例。

原理

给定一组三维空间中的点 P = { p 1 , p 2 , ⋯ , p n } \mathbf{P} = \{\mathbf{p}_1, \mathbf{p}_2, \cdots, \mathbf{p}_n\} P={p1,p2,,pn},其中 p i = [ x i , y i , z i ] T \mathbf{p}_i = [x_i, y_i, z_i]^T pi=[xi,yi,zi]T。我们的目标是找到一个平面方程 z = a x + b y + c z=ax + by + c z=ax+by+c 来拟合这些点。

可以通过最小化点到平面的距离平方和来实现平面拟合。具体步骤如下:

  1. 计算点集的质心 c = 1 n ∑ i = 1 n p i \mathbf{c} = \frac{1}{n}\sum_{i = 1}^{n}\mathbf{p}_i c=n1i=1npi
  2. 将点集进行中心化 q i = p i − c \mathbf{q}_i = \mathbf{p}_i - \mathbf{c} qi=pic i = 1 , 2 , ⋯ , n i = 1, 2, \cdots, n i=1,2,,n
  3. 构建数据矩阵 A = [ q 1 , q 2 , ⋯ , q n ] T A = [\mathbf{q}_1, \mathbf{q}_2, \cdots, \mathbf{q}_n]^T A=[q1,q2,,qn]T
  4. 对数据矩阵进行奇异值分解 A = U Σ V T A = U\Sigma V^T A=UΣVT,其中 U U U n × n n\times n n×n 的正交矩阵, Σ \Sigma Σ n × 3 n\times 3 n×3 的对角矩阵, V V V 3 × 3 3\times 3 3×3 的正交矩阵。
  5. 确定平面的法向量 V V V 的最后一列对应的向量即为平面的法向量 n = [ a , b , c ] T \mathbf{n} = [a, b, c]^T n=[a,b,c]T

Python代码实现

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef plane_fit(x, y, z):"""拟合平面 z = Ax + By + C 到给定的 (x, y, z) 数据:param x: 一维数组,x 坐标:param y: 一维数组,y 坐标:param z: 一维数组,z 坐标:return: A, B, C 平面方程的系数"""# 计算数据点的质心P = np.array([np.mean(x), np.mean(y), np.mean(z)])# 数据中心化centered_data = np.column_stack((x - P[0], y - P[1], z - P[2]))# 进行奇异值分解U, S, Vt = np.linalg.svd(centered_data)# 获取平面的法向量print(Vt)N =-1/Vt[-1,-1]* Vt[-1, :] print(N)# 提取平面方程的系数A = N[0]B = N[1]C = -np.dot(P, N)print(A,B,C)return A, B, C# 示例代码
if __name__ == "__main__":# 生成网格数据x_grid, y_grid = np.meshgrid(np.linspace(0, 10, 20), np.linspace(0, 10, 20))# 定义平面方程的真实参数a = 1b = 2c = -2# 计算理论 z 值z_grid = (a * x_grid) + (b * y_grid) + c# 将网格数据转换为一维数组x = x_grid.flatten()y = y_grid.flatten()z = z_grid.flatten()# 添加高斯噪声z = z + np.random.randn(len(z))# 拟合平面A, B, C = plane_fit(x, y, z)# 生成用于绘制拟合平面的网格X, Y = np.meshgrid(np.linspace(np.min(x), np.max(x), 20), np.linspace(np.min(y), np.max(y), 20))# 计算拟合平面的 z 值Z = (A * X) + (B * Y) + C# 创建 3D 图形fig = plt.figure()ax = fig.add_subplot(111, projection='3d')# 绘制原始数据点ax.scatter(x, y, z, c='r', marker='.')# 绘制拟合平面ax.plot_surface(X, Y, Z, color='g', alpha=0.5)# 设置坐标轴网格ax.grid(True)# 设置图形标题title = f' a={a:.4f},b={b:.4f},c={c:.4f},\nA={A:.4f},B={B:.4f},C={C:.4f}'ax.set_title(title)# 显示图形plt.show()

<a class=SVD拟合点云平面" />

代码解释

  1. 计算质心:使用 np.mean 函数计算点集的质心。
  2. 中心化点集:将每个点减去质心,得到中心化后的点集。
  3. 奇异值分解:使用 np.linalg.svd 函数对数据矩阵进行奇异值分解。
  4. 确定法向量:取 V V V 的最后一列作为平面的法向量。

复杂度分析

  • 时间复杂度:主要由奇异值分解的复杂度决定,为 O ( n m 2 ) O(nm^2) O(nm2),其中 n n n 是点的数量, m = 3 m = 3 m=3 是点的维度。
  • 空间复杂度:主要用于存储数据矩阵和奇异值分解的结果,为 O ( n m ) O(nm) O(nm)

http://www.ppmy.cn/news/1574782.html

相关文章

从Majorana 1芯片看微软量子计算路径及竞品对比分析

一、引言 1.1 研究背景与意义 在科技飞速发展的当下,量子计算已成为全球瞩目的前沿领域,被视为引领未来科技变革的关键力量。量子计算利用量子比特的叠加和纠缠等量子特性,能够实现远超传统计算机的计算能力,在解决复杂科学问题、优化算法以及推动多领域创新等方面展现出…

【深度学习】Transformer入门:通俗易懂的介绍

【深度学习】Transformer入门&#xff1a;通俗易懂的介绍 一、引言二、从前的“读句子”方式三、Transformer的“超级阅读能力”四、Transformer是怎么做到的&#xff1f;五、Transformer的“多视角”能力六、Transformer的“位置记忆”七、Transformer的“翻译流程”八、Trans…

ViceVersa Pro: 让文件夹、PC 及服务器之间的 TB 级文件同步更简单

ViceVersa Pro 是适用于 Windows 的高级文件同步软件&#xff0c;支持跨计算机、服务器和磁盘进行文件同步。 功能强大且易于使用的文件同步软件 文件同步是确保两个或多个位置包含相同的最新信息内容的一个过程。如果您从一个位置添加、更改或删除文件&#xff0c;则同步过程…

使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统

GitHub代码仓库 架构 从高层次来看&#xff0c;这些系统的步骤如下&#xff1a; 将问题转换为SQL查询&#xff1a;模型将用户输入转换为SQL查询。 执行SQL查询&#xff1a;执行查询。 回答问题&#xff1a;模型根据查询结果响应用户输入。 样本数据 下载样本数据&#xf…

分享一个免费的CKA认证学习资料

关于CKA考试 CKA&#xff08;Certified Kubernetes Administrator&#xff09;是CNCF基金会&#xff08;Cloud Native Computing Foundation&#xff09;官方推出的Kubernetes管理员认证计划&#xff0c;用于证明持有人有履行Kubernetes管理的知识&#xff0c;技能等相关的能力…

deepseek解答限流方法

你能用java写一段代码&#xff0c;要求是接收高并发的请求&#xff0c;做好分流和限流 DeepSeek-R1满血版思考完成 好的&#xff0c;我现在需要帮用户用Java写一段代码&#xff0c;要求是能处理高并发请求&#xff0c;同时做好分流和限流。首先&#xff0c;我得理清楚用户的需…

网站快速收录:如何优化网站图片Alt标签?

优化网站图片的Alt标签对于提升网站快速收录和SEO效果至关重要。以下是一些具体的优化策略&#xff1a; 一、Alt标签的作用 描述图片内容&#xff1a;Alt标签为搜索引擎提供了图片内容的文本描述&#xff0c;有助于搜索引擎理解图片所展示的信息。 提升用户体验&#xff1a;…

【算法与数据结构】Dijkstra算法求单源最短路径问题

目录 Dijkstra算法 算法简介&#xff1a; 该算法的核心思想&#xff1a; 算法特点&#xff1a; 算法示例演示&#xff1a; 算法实现&#xff1a; 邻接矩阵存图 邻接表存图&#xff1a; 时间复杂度分析&#xff1a; Dijkstra算法 算法简介&#xff1a; Dijkstra算法&am…