1. 程式人生 > >最小二乘法擬合球及其相關程式碼實現

最小二乘法擬合球及其相關程式碼實現

當我們手中握有大量的資料時,對於二維的資料,我們會對他們進行直線擬合、對數擬合,圓曲線的擬合等等。這些擬合的方法都是運用的了非常古老而又非常有效的方法,即最小二乘法。 
今天給大家介紹一種三維球面資料的擬合方法,該方法也是運用的最小二乘的方法。旨在使擬合的半徑在均方意義下誤差達到最小。

公式推導

設擬合後的球面的球心為(x_0,y_0,z_0)及半徑r。 
對於每一點擬合後估計的值與實際值的差值為: 
1 
則誤差的平方和為: 
2 
注意E是x_0,y_0,z_0,r的函式。因此令E分別對x_0,y_0,z_0,r的偏導數等於0,即可求出x_0,y_0,z_0,r,有: 
3 
令: 
4 
則有: 
5 
由(1)-(4)得 
6 
由(2)-(4)得 
7 
由(3)-(4)得 
8

 
寫成矩陣的形式: 
9 
求解該矩陣得到x_0,y_0,z_0值,然後帶入(4)式中得到r的值。

Matlab模擬

首先生成若干個球面資料,然後加入一定能量的噪聲。最後利用上述的公式計算擬合後的球心座標和球面半徑,下面給出的是matlab模擬程式碼:

%最小二乘的方法進行擬合
clear all;
close all
clc;
R = 2;         %球面半徑
x0 = 100;      %球x座標
y0 = 1;        %球y座標
z0 = 76;       %球心z座標
%********************************生成隨機球面資料********************
**************** alfa = 0:pi/50:pi; sita = 0:pi/50:2*pi; num_alfa = length(alfa); num_sita = length(sita); x = zeros(num_alfa,num_sita); y = zeros(num_alfa,num_sita); z = zeros(num_alfa,num_sita); for i = 1:num_alfa for j = 1:num_sita x(i,j) = x0+R*sin(alfa(i))*cos(sita(j)); y(i,j) = y0+R*sin
(alfa(i))*sin(sita(j)); z(i,j) = z0+R*cos(alfa(i)); end end x = reshape(x,num_alfa*num_sita,1); y = reshape(y,num_alfa*num_sita,1); z = reshape(z,num_alfa*num_sita,1); figure; plot3(x,y,z,'*'); title('生成的沒有噪聲的球面資料'); %加入均值為0的高斯分佈噪聲 amp = 0.1; x = x + amp*rand(num_alfa*num_sita,1); y = y + amp*rand(num_alfa*num_sita,1); z = z + amp*rand(num_alfa*num_sita,1); figure; plot3(x,y,z,'*'); title('加入噪聲的球面資料'); %******************************************************************************************* %球面擬合算法 num_points = length(x); x_avr = sum(x)/num_points; y_avr = sum(y)/num_points; z_avr = sum(z)/num_points; xx_avr = sum(x.*x)/num_points; yy_avr = sum(y.*y)/num_points; zz_avr = sum(z.*z)/num_points; xy_avr = sum(x.*y)/num_points; xz_avr = sum(x.*z)/num_points; yz_avr = sum(y.*z)/num_points; xxx_avr = sum(x.*x.*x)/num_points; xxy_avr = sum(x.*x.*y)/num_points; xxz_avr = sum(x.*x.*z)/num_points; xyy_avr = sum(x.*y.*y)/num_points; xzz_avr = sum(x.*z.*z)/num_points; yyy_avr = sum(y.*y.*y)/num_points; yyz_avr = sum(y.*y.*z)/num_points; yzz_avr = sum(y.*z.*z)/num_points; zzz_avr = sum(z.*z.*z)/num_points; %計算求解線性方程的係數矩陣 A = [xx_avr - x_avr*x_avr,xy_avr - x_avr*y_avr,xz_avr - x_avr*z_avr; xy_avr - x_avr*y_avr,yy_avr - y_avr*y_avr,yz_avr - y_avr*z_avr; xz_avr - x_avr*z_avr,yz_avr - y_avr*z_avr,zz_avr - z_avr*z_avr]; b = [xxx_avr - x_avr*xx_avr + xyy_avr - x_avr*yy_avr + xzz_avr - x_avr*zz_avr; xxy_avr - y_avr*xx_avr + yyy_avr - y_avr*yy_avr + yzz_avr - y_avr*zz_avr; xxz_avr - z_avr*xx_avr + yyz_avr - z_avr*yy_avr + zzz_avr - z_avr*zz_avr]; b = b/2; resoult = inv(A)*b; x00 = resoult(1); %擬合出的x座標 y00 = resoult(2); %擬合出的y座標 z00 = resoult(3); %擬合出的z座標 r = sqrt(xx_avr-2*x00*x_avr+x00*x00 + yy_avr-2*y00*y_avr+y00*y00 + zz_avr-2*z00*z_avr+z00*z00); %擬合出的球半徑r
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

執行的結果如下: 
10 
11 
擬合後的x00=100.0502, y00=1.0491, z00=76.0512, r=2.0009與真實的x0=100, y0=1, z0=76, R=2非常的接近。

當然如果得到的球面資料不是在整個球面均勻分佈的也可以得到很不錯的擬合結果,當得到的資料如下圖所示: 
12 
13 

擬合後的x00=100.0510, y00=1.0537, z00=76.0540, r= 1.9952與真實值依然很接近。

原文地址

http://blog.csdn.net/hj199404182515/article/details/53462512

但是個人感覺他的求導推導有問題

歡迎大家一起來討論一下:


紅色標記部分

歡迎高手給以解釋,非常感謝

掃碼關注我們:跟著數理化走天下


獲得更多的資訊哦,一起交流,一起成長哦:微訊號:跟著數理化走天下,純屬個人的交流,無盈利目的


相關推薦

乘法及其相關程式碼實現

當我們手中握有大量的資料時,對於二維的資料,我們會對他們進行直線擬合、對數擬合,圓曲線的擬合等等。這些擬合的方法都是運用的了非常古老而又非常有效的方法,即最小二乘法。 今天給大家介紹一種三維球面資料的擬合方法,該方法也是運用的最小二乘的方法。旨在使擬合的半徑在均方意義下誤差達

乘法圓公式推導及其實現

https://blog.csdn.net/Jacky_Ponder/article/details/703149191.1最小二乘擬合圓介紹與推導最小二乘法(least squares analysis)是一種數學優化技術,它通過最小化誤差的平方和找到一組資料的最佳函式匹配。最小二乘法是用最簡的方法求得一些

利用乘法脫密坐標的方法

微信 旋轉 殘差 擬合 cnblogs 整體 ont soft 尋找 文章版權由作者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/ 1.背景 公司某項目中,業主使用了由中科院進行過脫密處理的公網地圖,同時提供

python中matplotlib實現乘法的過程詳解

ast array plt atp ons 正則 key code 擬合 這篇文章主要給大家介紹了關於python中matplotlib實現最小二乘法擬合的相關資料,文中通過示例代碼詳細介紹了關於最小二乘法擬合直線和最小二乘法擬合曲線的實現過程,需要的朋友可以參考借鑒,下

乘法直線方程

Code(python) x = [] y = [] n = input(); n = int(n) sumx = 0 sumx2 = 0 sumy = 0 sumxy = 0 for i in range(n): v = input() v = float

乘法

import numpy as np #P145 例題2 x=np.array([-1,-0.75,-0.5,-0.25,0,0.25,0.5,0.75,1]) y=np.array([-0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334

python3-多項式乘法

class numpy.poly1d(c_or_r, r=False, variable=None)[source]引數:c_or_r:array_like多項式的係數,或者如果第二個引數的值是True,多項式的根(值多項式的求值結果為0)。例如,poly1d([1, 2, 3])返回一個物件,代表:x ^

乘法圓公式推導及vc實現[r]

{    if (m_nNum<3)    {        return;    }    int i=0;    double X1=0;    double Y1=0;    double X2=0;    double Y2=0;    double X3=0;    double Y3=0; 

基於OpenCV資料結構乘法圓-程式碼部分

對於網上常用的擬合圓程式碼(經過修改, 因為除數可能為0) /* * 參考: http://blog.csdn.net/liyuanbhu/article/details/50889951 * 通過最小二乘法來擬合圓的資訊 * pts: 所有點座標 * center: 得到

乘法直線c++程式碼

最近公司的一個專案需要計算TVDI(Temperature Vegetation Dryness Index ,溫度植被幹旱指數) ,TVDI的計算公式如下(具體原理自行百度): 其中,為任意像元的地表溫度;為某一NDVI對應的最小地表溫度,對應的是溼邊;為某一NDVI對應的最大地表

opencv學習——乘法直線

 最小二乘法擬合直線概念:最小二乘法多項式直線擬合,根據給定的點,求出它的函式y=f(x),當然求得準確的函式是不太可能的,但是我們能求出它的近似曲線y=φ(x)原理假設有點

如何使用線性代數實現乘法曲線

也許在我們讀高中的時候,就知道在數學的世界裡,有一種直線擬合的方式:最小二乘法。它是一種數學優化技術,原理是通過最小化誤差的平方和尋找資料的最佳函式匹配。 比如研究x和y之間的關係,假設我們擁有的資料是將這些資料描繪在x-y直角座標系中,發現這些點並沒有能夠連線成一條直線。

乘法直線--C++/Opencv

1.原理 在現實中經常遇到這樣的問題,一個函式並不是以某個數學表示式的形式給出,而是以一些自變數與因變數的對應表給出,老師講課的時候舉的個例子是犯罪人的身高和留下的腳印長,可以測出一些人的資料然後得到一張表,它反應的是一個函式,迴歸的意思就是將它還原成數學表示式,這個

(九)次曲線

.fig pac atp matrix plot .text Coding 運算 提取數據 1 #coding=utf-8 2 from numpy import * 3 import numpy as np 4 import matplotlib.pyplo

有用 初始 等於 計算 合成 mage RR 周期性 () 來自:某小皮 最優化函數庫Optimization 優化是找到最小值或等式的數值解的問題。scipy.optimization子模塊提供函數最小值,曲線擬合和尋找等式的跟的有用算法。 最小二乘擬合 假設有一組實驗數

halcon之直線

如果不瞭解最小二乘演算法 請先閱讀: Least squares的演算法細節原理https://en.wikipedia.org/wiki/Least_squares 通常在halcon中擬合直線會用houghline或者 fitline。本文提供一種新的選擇,用halcon的矩陣操作

RANSAC與 通俗講解

一、RANSAC理論介紹 普通最小二乘是保守派:在現有資料下,如何實現最優。是從一個整體誤差最小的角度去考慮,儘量誰也不得罪。 RANSAC是改革派:首先假設資料具有某種特性(目的),為了達到目的,適當割捨一些現有的資料。 給出最小二乘擬合(紅線)、RANSAC(綠線)對於一階直線、二階

3D點雲法向量估計(平面)

1、點雲法向量估計的主要思路是對K-近鄰的N個點進行平面擬合(平面過N點重心),平面法向量即為所求; 2、最小二乘擬合可以轉換為求協方差矩陣最小特徵值對應的特徵向量(SVD分解);此種解法對資料噪聲有很強的魯棒性,關鍵點在於要對資料去中心化處理,將座標原點移動到資料重心。 3、最後根據特徵點P到重心Oi形成的

Andrew Ng機器學習筆記2——梯度下降法and

今天正式開始學習機器學習的演算法,老師首先舉了一個例項:已知某地區的房屋面積與價格的一個數據集,那麼如何預測給定房屋面積的價格呢?我們大部分人可以想到的就是將畫出房屋面積與價格的散點圖,然後擬合出價格關於面積的曲線,那麼對於一個已知的房屋面積,就可以在擬合的曲線上得到預測的

關於Matlab中的線性與非線性

1、線性最小二乘擬合 最小二乘法(又稱最小平方法)是一種數學優化技術,其通過最小化誤差的平方和尋找資料的最佳函式匹配。利用最小二乘法可以簡便地求得未知的資料,並使得這些求得的資料與實際資料之間誤差的平方和為最小。最小二乘法通過變數的資料來描述變數之間的相互關係。例如通過描述