最小二乘拟合平面——拉格朗日乘子法

目录

  • 一、算法原理
  • 二、代码实现
    • 1、python
    • 2、matlab
  • 三、算法效果

一、算法原理

  设拟合出的平面方程为:
a x + b y + c z + d = 0 (1) ax+by+cz+d=0\tag{1} ax+by+cz+d=0(1)
约束条件为: a 2 + b 2 + c 2 = 1 (2) a^2+b^2+c^2=1\tag{2} a2+b2+c2=1(2)
  可以得到平面参数 a 、 b 、 c 、 d a、b、c、d abcd。此时,要使获得的拟合平面是最佳的,就是使点到该平面的距离的平方和最小,即满足:
e = ∑ i = 1 n d i 2 → m i n (3) e=\sum_{i=1}^nd_i^2\rightarrow min\tag{3} e=i=1ndi2min(3)
  式中, d i = ∣ a x i + b y i + c z i + d ∣ d_i=|ax_i+by_i+cz_i+d| di=axi+byi+czi+d,是点云数据中的任一点 p i ( x i , y i , z i ) p_i(x_i,y_i,z_i) pi(xi,yi,zi)到这个平面的距离。要使 e → m i n e\rightarrow min emin,可以利用拉格朗日乘子法求解极值,得到函数:
f = e − λ ( a 2 + b 2 + c 2 − 1 ) = ∑ i = 1 n d i 2 − λ ( a 2 + b 2 + c 2 − 1 ) (4) f = e - λ(a^2 + b^2 + c^2 - 1) =\sum_{i=1}^nd_i^2 - λ(a^2 + b^2 + c^2 - 1) \tag{4} f=eλ(a2+b2+c21)=i=1ndi2λ(a2+b2+c21)(4)

  先将式(2-4)两边对 d d d求偏导,并且令偏导数为零,得到:
d = 1 n ( a ∑ i = 1 n x i 2 + b ∑ i = 1 n y i 2 + c ∑ i = 1 n z i 2 ) (5) d=\frac{1}{n}(a\sum_{i=1}^nx_i^2+b\sum_{i=1}^ny_i^2+c\sum_{i=1}^nz_i^2)\tag{5} d=n1(ai=1nxi2+bi=1nyi2+ci=1nzi2)(5)
x ˉ = ∑ i = 1 n x i n \bar{x}=\sum_{i=1}^n\frac{x_i}{n} xˉ=i=1nnxi y ˉ = ∑ i = 1 n y i n \bar{y}=\sum_{i=1}^n\frac{y_i}{n} yˉ=i=1nnyi z ˉ = ∑ i = 1 n z i n \bar{z}=\sum_{i=1}^n\frac{z_i}{n} zˉ=i=1nnzi,质心为 P ˉ = ( x ˉ , y ˉ , z ˉ ) \bar{P}=(\bar{x},\bar{y},\bar{z}) Pˉ=(xˉ,yˉ,zˉ) Δ x i = x i − x ˉ \Delta x_i=x_i-\bar{x} Δxi=xixˉ Δ y i = y i − y ˉ \Delta y_i=y_i-\bar{y} Δyi=yiyˉ Δ z i = z i − z ˉ \Delta z_i=z_i-\bar{z} Δzi=zizˉ则:
d i = ∣ a Δ x i + b Δ y i + c Δ z i ∣ (6) d_i=|a\Delta x_i+b\Delta y_i+c\Delta z_i|\tag{6} di=aΔxi+bΔyi+cΔzi(6)
  再对式(2-4)两边求对 a 、 b 、 c a 、b 、c abc 的偏导数,得
{ 2 ∑ i = 1 n ( a Δ x i + b Δ y i + c Δ z i ) Δ x i − 2 λ a = 0 2 ∑ i = 1 n ( a Δ x i + b Δ y i + c Δ z i ) Δ y i − 2 λ b = 0 2 ∑ i = 1 n ( a Δ x i + b Δ y i + c Δ z i ) Δ z i − 2 λ c = 0 \begin{cases} 2\sum_{i=1}^n(a\Delta x_i+b\Delta y_i+c\Delta z_i)\Delta x_i-2λa=0\\ 2\sum_{i=1}^n(a\Delta x_i+b\Delta y_i+c\Delta z_i)\Delta y_i-2λb=0\\ 2\sum_{i=1}^n(a\Delta x_i+b\Delta y_i+c\Delta z_i)\Delta z_i-2λc=0 \end{cases} 2i=1n(aΔxi+bΔyi+cΔzi)Δxi2λa=02i=1n(aΔxi+bΔyi+cΔzi)Δyi2λb=02i=1n(aΔxi+bΔyi+cΔzi)Δzi2λc=0

  将上述方程组构成特征值方程:
A x = λ x (7) Ax = λx \tag{7} Ax=λx(7)
式中,
A = [ ∑ i = 1 n Δ x i 2 ∑ i = 1 n Δ x i Δ y i ∑ i = 1 n Δ x i Δ z i ∑ i = 1 n Δ x i Δ y i ∑ i = 1 n Δ y i 2 ∑ i = 1 n Δ y i Δ z i ∑ i = 1 n Δ x i Δ z i ∑ i = 1 n Δ y i Δ z i ∑ i = 1 n Δ z i 2 ] A= \left[ \begin{matrix} \sum_{i=1}^n\Delta x_{i}^{2}&\sum_{i=1}^n\Delta x_{i}\Delta y_{i}&\sum_{i=1}^n\Delta x_{i}\Delta z_{i} \\ \sum_{i=1}^n\Delta x_{i}\Delta y_{i}&\sum_{i=1}^n\Delta y_{i}^{2}&\sum_{i=1}^n\Delta y_{i}\Delta z_{i} \\ \sum_{i=1}^n\Delta x_{i}\Delta z_{i} &\sum_{i=1}^n\Delta y_{i}\Delta z_{i} &\sum_{i=1}^n\Delta z_{i}^{2}\\ \end{matrix} \right] A= i=1nΔxi2i=1nΔxiΔyii=1nΔxiΔzii=1nΔxiΔyii=1nΔyi2i=1nΔyiΔzii=1nΔxiΔzii=1nΔyiΔzii=1nΔzi2
x = [ a b c ] x= \left[ \begin{matrix} a\\ b\\ c\\ \end{matrix} \right] x= abc
  那么,求解平面参数 a 、 b 、 c a 、b 、c abc ,就是求解矩阵的特征值和特征向量。又因为 A A A 是3 阶实对称矩阵,其特征值求解公式为:
λ = ( A x ) T x x T x , x ≠ 0 (8) λ=\frac{(Ax)^Tx}{x^Tx},x\neq0\tag{8} λ=xTx(Ax)Tx,x=0(8)
  在约束条件 a 2 + b 2 + c 2 = 1 a^2 + b^2 + c^2 = 1 a2+b2+c2=1 下,得 λ = ∑ i = 1 n ( a Δ x i + b Δ y i + c Δ z i ) 2 = ∑ i = 1 n d i 2 = e λ=\sum_{i=1}^n(a\Delta x_i+b\Delta y_i+c\Delta z_i)^2=\sum_{i=1}^nd_i^2=e λ=i=1n(aΔxi+bΔyi+cΔzi)2=i=1ndi2=e。 所以, e e e最小值就是矩阵 A A A的最小特征值,对应特征向量为平面参数 a 、 b 、 c a 、b 、c abc ,利用质心可求得 d d d

二、代码实现

1、python

import numpy as np


# 创建函数,用于生成不同属于一个平面的100个离散点
def not_all_in_plane(a, b, c):
    x = np.random.uniform(-10, 10, size=100)
    y = np.random.uniform(-10, 10, size=100)
    z = (a * x + b * y + c) + np.random.normal(-1, 1, size=100)
    return x, y, z


# 调用函数,生成离散点
x, y, z = not_all_in_plane(2, 5, 6)
# 计算质心
x0 = np.mean(x)
y0 = np.mean(y)
z0 = np.mean(z)
# 去质心
x = x - x0
y = y - y0
z = z - z0
# ------------------------构建系数矩阵-----------------------------
A = np.array([[sum(x * x), sum(x * y), sum(x * z)],
              [sum(x * y), sum(y * y), sum(y * z)],
              [sum(x * z), sum(y * z), sum(z * z)]])
[D, X] = np.linalg.eig(A)

print('平面拟合结果为:z = %.3f * x + %.3f * y + %.3f' % (X[0, 2], X[1, 2], X[2, 2]))

2、matlab

clc;clear;
%% -------------------------------读取点云---------------------------------
pc = ReadPointCloud('plane1.pcd');
%% -----------------------------获取点云信息-------------------------------
n ; % 点的个数
x ; % 点的x坐标
y ; % 点的y坐标
z ; % 点的z坐标
% 1、计算点云质心
centroid = pcmean(pc);
% 2、去质心化
deMean=pcdemean(pc.Location,centroid);
%% -------------------------------拟合平面---------------------------------
% 3、矩阵A
A = [sumXX sumXY sumXZ;
	sumXY sumYY sumYZ;
	sumXZ sumYZ sumZZ];
% 4、矩阵A分解求特征值特征向量
[V,D]=eig(A);
a = V(1,1);b = V(2,1);c = V(3,1);
% 5、计算原点到拟合平面的距离
d = -dot([a b c],centroid);
%% ---------------------------可视化拟合结果-------------------------------
 figure
% 图形绘制
scatter3(x,y,z,'filled')
hold on;
[XFit,YFit]= meshgrid (xfit,yfit);
mesh(XFit,YFit,ZFit);
title('拉格朗日乘子法拟合平面');


三、算法效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/38141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ahk1.1获取输入光标当前位置坐标(不是鼠标的位置)

F1 Up::Caret:GetCaretPos(1), hasCaretPos:1x坐标 : Caret.xy坐标 : Caret.yToolTip, %x坐标% %y坐标%Return; 获取光标坐标GetCaretPos(Byacc:1){Static initIf (A_CaretX""){Caretx:Carety:CaretH:CaretW:0If (Byacc){If (!init)init:DllCall("LoadLibrary&q…

Access violation at address 00000000. Read of address 00000000.的解决办法

Access violation at address 00000000. Read of address 00000000. 原理解决办法 在使用spacesniffer查看C盘空间的时候报错 原理 这个问题是关于Access Violation(非法访问),General Protection Fault(一般保护性错误&#x…

pytorch构建深度网络的基本概念——随机梯度下降

文章目录 随机梯度下降定义一个简单的模型定义Loss什么是梯度随机梯度下降 随机梯度下降 现在说说深度学习中的权重更新算法:经典算法SGD:stochastic gradient descent,随机梯度下降。 定义一个简单的模型 假设我们的模型就是要拟合一根直…

IDEA+springboot + ssm +shiro+ easyui +mysql实现的进销存系统

IDEAspringboot ssm shiro easyui mysql实现的进销存系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.首页3.修改密码4.系统日志5. 用户管理6. 角色管理7. 进货入库8.退货出库9.进货单据查询10.退货单据查询11.当前库存查询12.销售出库13.客户退货14. 销售单据查询15…

HTML和CSS配合制作一个简单的登录界面

HTML和CSS配合制作一个简单的登录界面 界面HTMLCSS解释语法 界面 HTML <!DOCTYPE html> <html lang"en"> <head><title>篮球世界</title><meta charset"UTF-8"><link type"text/css" rel"styleshe…

从Web2到Web3:区块链技术的未来前景

随着互联网的发展&#xff0c;Web1.0、Web2.0 和 Web3.0 成为了人们口中津津乐道的话题。那么&#xff0c;这三种网络时代究竟有什么区别呢&#xff1f; Web1.0 是一个只读的时代&#xff0c;那个时候&#xff0c;用户只能浏览网页&#xff0c;无法进行互动和创作。Web2.0 则是…

github搜索案例

目录结构 public/index.html <!DOCTYPE html> <html lang""><head><meta charset"utf-8"><!-- 针对IE浏览器的一个特殊配置&#xff0c;含义是让IE浏览器以最高的渲染级别渲染页面 --><meta http-equiv"X-UA-Comp…

AI绘画Stable Diffusion实战操作: 62个咒语调教-时尚杂志封面

今天来给大家分享&#xff0c;如何用sd简单的咒语输出好看的图片的教程&#xff0c;今天做的是时尚杂志专题&#xff0c;话不多说直入主题。 还不会StableDiffusion的基本操作&#xff0c;推荐看看这篇保姆级教程&#xff1a; AI绘画&#xff1a;Stable Diffusion 终极炼丹宝…

Win32 汇编在对话框上画线

参阅前文&#xff0c;首先要有一个基本的对话框&#xff1b; 把对话框资源文件里的控件定义都删除&#xff0c;得到的一个rc文件&#xff0c;test.rc&#xff1b; #include <resource.h>#define DLG_MAIN 1DLG_MAIN DIALOG 193, 180, 130, 150 STYLE DS_MODALFRAME | …

用主流编程语言解小学题

最近在网上刷到一个视频&#xff0c;内容是奶奶有60 元钱&#xff0c;去超市买了10元水果&#xff0c;收营员应该找奶奶多少钱?我一开始反应就是50元&#xff0c;后来想了想题干里没有说明这60元是怎么构成的&#xff0c;有可能是一张50元和一张10元&#xff0c;或者是3张20元…

图形编辑器开发:一些会用到的简单几何算法

大家好&#xff0c;我是前端西瓜哥。 开发图形编辑器&#xff0c;你会经常要解决一些算法问题。本文盘点一些我开发图形编辑器时遇到的简单几何算法问题。 矩形碰撞检测 判断两个矩形是否发生碰撞&#xff08;或者说相交&#xff09;&#xff0c;即两个矩形有重合的区域。 …

lwip-2.1.3自带的httpd网页服务器使用教程(一)从SD卡读取网页文件并显示

概述 本教程使用的单片机是STM32F103ZE&#xff0c;有线网口芯片为ENC28J60。 本教程里面的网页由于需要兼容Windows XP系统的IE8浏览器&#xff0c;所以采用HTML 4.01编写&#xff0c;不使用任何前端框架。笔者使用的网页设计软件是Adobe Dreamweaver CS3。 开发板PCB文件是公…

我造了一个新的词汇:信息湍流

信息湍流 信息湍流的简介起因有出现信息湍流的领域如何做信息湍流的计算 信息湍流的简介 在物流学中&#xff0c;一个物体从一个位置到另外一个位置&#xff0c;我们可以通过精确的公式计算来预测出新位置。 而水和气体则是大量一个一个物体组成的新物体&#xff0c;称为&…

【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

创建项目 下图为初始化的项目的文件结构 引入组件 俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”&#xff0c;为了更加方便地开发出页面较为美观的小程序&#xff0c;我们先引入成熟的UI组件&#xff0c;再开始开发之旅。&#xff08;如果你是前端高手&#xff0…

人工智能-神经网络

目录 1 神经元 2 MP模型 3 激活函数 3.1 激活函数 3.2 激活函数作用 3.3 激活函数有多种 4、神经网络模型 5、神经网络应用 6、存在的问题及解决方案 6.1 存在问题 6.2 解决方案-反向传播 1 神经元 神经元是主要由树突、轴突、突出组成&#xff0c;树突是从上面接收很多…

【DeepLabCut】初识姿势估计 | DeepLabCut教程 | 单动物实现

&#x1f4e2;前言&#xff1a;姿势估计作为计算机视觉领域中的一个重要分支&#xff0c;本章将介绍姿势估计和一个用于姿势估计的工具。并以斑马鱼的运动视频为例&#xff0c;手把手教你如何用deeplabcut训练自己的数据。 目录 Ⅰ 初识姿势估计 0x00 姿势估计介绍 Ⅱ 初…

Android ART虚拟机系列: 虚拟机CheckPoint机制分析

背景 在Android ART虚拟机中&#xff0c;GC的部分流程中会执行stop the world的操作&#xff0c;那么&#xff0c;STW在虚拟机中如何实现呢&#xff1f;本文就深入到ART虚拟机源码中&#xff0c;探寻STW的实现过程。 【本文基于android12源码分析】 CheckPoint机制 ART虚拟机…

如何用Stable Diffusion模型生成个人专属创意名片?

目录 1 什么是二维码&#xff1f;2 什么是扩散模型&#xff1f;3 Stable Diffusion环境搭建4 开始制作创意名片结语 1 什么是二维码&#xff1f; 二维码是一种用于存储和传输信息的方便而广泛使用的图像编码技术。它是由黑色方块和白色空白区域组成的二维图形&#xff0c;可以…

简化生活之让AI以指定格式输出

原文合集地址如下&#xff0c;有需要的朋友可以关注 本文地址 合集地址 今天京东也宣布即将发布了自己的大模型&#xff0c;那么使用AI大模型进行工作或者生活将是必不可少的步骤。 建立命令 AI大模型是一种生成式聊天对话模型&#xff0c;我们可以通过预先定义命令的方式…

SpringBoot集成Flowable工作流

SpringBoot集成Flowable工作流 Flowable是什么&#xff1f;一、添加依赖二、flowable配置三、定义流程文件1.使用流程文件定义工作流2.idea使用插件来定义流程图1.安装插件2.创建bpmn文件并画流程图3.右击流程用模型设计器打开文件 四、测试controller Flowable是什么&#xff…