1.移動最小二乘法
上篇論文采用最小二乘法來擬合曲線期升,如果離散數據量比較大,形狀復雜烙样,還需要分段擬合和平滑化,因此采用移動最小二乘法進行曲線擬合蕊肥,可以克服上面的缺點谒获,還具有一些優(yōu)點;
移動最小二乘法與傳統的最小二乘法相比壁却,有兩個比較大的改進:
( 1)擬合函數的建立不同批狱。這種方法建立擬合函數不是采用傳統的多項式或其它函數,而是由一個系數向量 a(x)和基函數 p(x)構成展东, 這里 a(x)不是常數赔硫,而是坐標 x 的函數倘屹。
( 2)引入緊支( Compact Support)概念衣式,認為點 x 處的值 y 只受 x
附近子域內節(jié)點影響,這個子域稱作點 x 的影響區(qū)域缰揪, 影響區(qū)域外的節(jié)點對 x的取值沒有影響砸王。在影響區(qū)域上定義一個權函數w(x)推盛, 如果權函數在整個區(qū)域取為常數, 就得到傳統的最小二乘法处硬。參考自《基于移動最小二乘法的曲線曲面擬合-曾清紅》
2.擬合函數的建立
在擬合區(qū)域的一個局部子域上小槐, 擬合函數 f (x)表示為:
式中
對于一維問題 :
基函數可以為 p(x)=
二維問題可以為: 線性基 p(x)=
, m=3 二次基 p(x) =
m=6
這是為在閱讀文獻時的疑惑控嗜,因為我解決的是一維問題,所以不需要二維的基函數骡显。
在移動最小二乘近似中, 系數 是通過令近似函數 u(x) 在點 x 的鄰域 內各節(jié)點誤差的加權平方和為最小來確定的
式中 n 為點 x 的鄰域 內所包含的節(jié)點數., 稱為節(jié)點 處的權函數, 它在節(jié)點 xI 周圍的一個有限區(qū)域中大于零, 而在該區(qū)域外為零 . 權函數的定義表明, 只有在節(jié)點 xI 的影響域范圍內的節(jié)點才對該點的近似函數產生影響.
這里對支撐域進行說明:
如圖:
將整個x范圍劃分為若干個區(qū)域疆栏,每個區(qū)域包含若干個x點曾掂,那么并且規(guī)定其中一點為標準點,其他點為參考點壁顶。
參考點與標準點的距離作為權函數的參數珠洗。得出權重。
3.權函數
權函數在移動最小二乘法中起著非常重要的作用若专。移動最小二乘法中的權函數
應該具有緊支性许蓖,也就是權函數在 x
的一個子域內不等于零, 在這個子域之外全為零调衰, 這個子域稱為權函數的支持域(即 x 的影響區(qū)域)膊爪。一般選擇圓形作為權函數的支持域(見圖其半徑記為。 由于權函數的緊支性嚎莉,只有這些包含在影響區(qū)域內的數據點對點 x 的取值有影響權函數
應該是非負的米酬,并且隨著
的增加單調遞減。權函數還應具有一定的光滑性趋箩,因為擬合函數會繼承權函數的連續(xù)性:如果權函數
是 C1 階連續(xù)的赃额,則擬合函數也是 C1 階連續(xù)的。常用的權函數是樣條函數
這里寫圖片描述
4
3 法方程的推導
對于任意函數 h(x) 和 g(x), 引入記號:
那么:
公式4可以寫為:
寫成矩陣形式:
由上面的法方程, 解得 a(x).
然后求解得出A(x),B(x) 求解得出(x)
4.擬合流程
這里說明一下為什么要網格化阁簸,網格化主要是選取標準點爬早,并以標準點來劃分支撐域,確定支撐域半徑和支撐域內的節(jié)點
x启妹。
我仍然以上篇最小二乘法的數據點為例筛严,通過代碼編寫移動最小二乘法的方法:
#主題部分
X=np.arange(-0.9,0.9,0.05)
# 數據點x個數
M=len(x)
# 基函數個數
N=2
p=np.zeros((M,2))
Y=[]
for XX in X:
w = np.zeros((M,1))
d=0.1 # 影響區(qū)域的半徑
for i in range(0,M):
w[i]=W_fun(d, x[i], XX)
p[i][0]=1
p[i][1]=x[i]
A=fun_A(x,w,p)
B=fun_B(y,w,p)
a=np.linalg.solve(A,B)
Y.append(a[0]+a[1]*XX)
----------
#其他函數部分
# 權函數
def W_fun(d,x,X):
s=abs(x-X)/d
if (s<=0.5):
return (2/3)-4*s**2+4*s**3
elif(s<=1):
return (4/3)-4*s+4*s**2-(4/3)*s**3
else:
return 0
# 權函數記號(pm,pn)的計算
def pm_pn(w,x,p,m,n):
# x為數據點,w為支撐域的權重饶米,M為數據點個數 p1,p2為傳入的數值
pmn=0
M=len(x)
# i代表數據點,m n代表(pm,pn)的下標
for i in range(M):
pmn=pmn+w[i]*p[i][m]*p[i][n]
return float(pmn)
# B矩陣的建立
def fun_B(u,w,p):
pumI=0
M=len(u) #數據點個數
m=p.shape[1] # 基函數個數
B=[]
for j in range(m):
for i in range(M):
pumI=pumI+w[i]*p[i][j]*u[i]
B.append(float(pumI))
return B
# A矩陣的建立
def fun_A(x,w,p):
M=len(x)函數
m=p.shape[1]
A=[]
for mm in range(m):
matA=[]
for nn in range(m):
pmn=pm_pn(w,x,p,mm,nn)
matA.append(pmn)
A.append(matA)
return A
結果
5.結果
綠色為移動最小二乘法桨啃,紅色為最小二乘法。
參考文獻:
1基于移動最小二乘法的曲線曲面擬合-曾清紅
2移動最小二乘法在多功能傳感器數據重構中的應用-劉丹
3 移動最小二乘法(MLS)曲線曲面擬合C++代碼實現
https://blog.csdn.net/liumangmao1314/article/details/54179526