在《高等數學》的書中給出了最小二乘法擬合直線的具體例項,但是那個例子是擬合二維直線的f(t)=at+b
,那麼三維直線怎麼使用最小二乘法來擬合呢?我們先來看看《高等數學》書中的例子,由於任何實數的平方都是正數或零,因此我們可以考慮選取常數
a, b
,使m最小來保證每個偏差的絕對值都很小,這種根據偏差的平方和為最小的條件來選擇常數
a, b
的方法叫做最小二乘法(
least square
)。因為
m是平方和,所以
m的最小值在導數等於零的時候取得,即:
根據這個條件計算得到的最小值就是最小二乘解。因為擬合函式是二維直線方程f(t)=at+b
是線性的,所以二維直線的擬合是線性最小二乘問題。對於三維直線,如果選擇其代數方程,是兩個平面的交線來表達的:
可以看出待確定的引數有8
個,不是乙個好辦法。可以採用直線的引數表達,根據直線的對稱式方程匯出直線的引數方程:
我們要做的是根據n
個取樣點
pi確定引數方程的p和
d,使所有取樣點到直線的距離的平方和最小。對於三維點到三維直線的距離我們可以使用向量方法來計算,可以參考《點向直線投影》,
向量v為
p到取樣點
pi的向量,向量
d為直線的方向向量,是單位向量。v和
d點乘得到v向
d的投影長度,即圖中紅色標示部分的長度
l。則取樣點到直線的距離的平方是向量
v的模的平方減去投影長度
l的平方。從而得到取樣點到直線的距離平方和方程:
參考「最小二乘法三維(k維)
直線擬合
可知,最小二乘法擬合的直線通過所有取樣點的中心點。即可以確定直線引數方程中的p
。這樣最小二乘方程就是只有方向向量的乙個多元函式。使用類
math_multiplevarfunctionwithgradient
來建立上述最小二乘方程:
其中成員變數mypoint
是直線的中心點,
mypoints
是所有的取樣點。最小二乘方程為確定直線引數方程中的方向向量(
dx, dy, dz
)的三個變數方程。使用
math_bfgs
之類的非線性極值計算類來對這個最小二乘方程進行求解。下面給出幾個測試用例:
綜上所述,擬合三維直線的最小二乘方程中點到直線的距離為點到直線的垂直距離,而書中二維直線擬合只是兩個y
值之間的差值:
圖 點到直線的距離 (來自:
上述擬合過程也可看出三維直線的擬合是乙個非線性的優化問題,處理這類問題的一般步驟就是先建立目標方程,再使用相關優化求解類來對方程進行求解。
最小二乘法 直線擬合
功能描述 利用最小二乘法求斜率 xytopx 截距 方法1 xytopy 斜率 ncount 點數 void min2method double xytopy,double xytopx,int x,int y,int ncount graphics.drawline pen,point x i y...
最小二乘法擬合直線 c 程式
point.h class point point類的宣告 float getx float gety friend float linefit point l point,int n point 友元函式 int型變數為點數 private 私有資料成員 float x,y end of poin...
最小二乘法 直線擬合 推薦方法
1.最小二乘法 首先舉個例子。針對線性最小二乘法即直線擬合,如下圖 來自維基百科 所示 根據已有的資料 圖中的點 來做出一條最貼近資料發展趨勢的直線。通過這條直線,我們可以對未來的資料進行 因為基本會落在這條直線附近。當然了,最小二乘法不只是直線,還可以是曲線,本文不討論。2.求解直線方程 我們現在...