具有归一化系数的平面拟合
plane fitting with normalized coefficients
我正在尝试使用 scipy.optimize.leastsq.
将 3d 点拟合到 2.5d/3d 中的平面
我正在尝试最小化函数:ax + by + c - z
当我向生成的平面添加噪声时,我开始得到 (a,b,c) 的不同结果,而 a 和 b 之间的线性关系仍然正确。
我的问题:有没有办法约束拟合参数的归一化?
我可以在优化后进行归一化,运行 再次搜索最后一个参数,但感觉效率低下并且会导致参数 c 发生很大变化,有什么建议吗?
谢谢!
以下是我在同一架飞机上得到的一些不同结果:
[ 12.88343415 6.7993803 4001.717 ]
[ 14.52913549 7.44262692 3201.1523]
[ 4.37394650e+00 2.20546734e+00 9.56e+03]
[ 24.32259278 12.32581015 -2748.026]
通过 sqrt(a2 +b2 +1) 归一化后:
[-0.97401694 0.20292819 -6.16468053]
[-0.97527745 0.1976869 -2.46058884]
[-0.97573799 0.19342358 5.42282738]
[ -0.97894621 0.17992336 13.52561491]
[ -0.97821728 0.17834579 24.5345626 ]
代码:
def least_squares(neighborhood,p0):
"""
computes the least mean squares solution for points in neighborhood.
p0 is the initial guess for (a,b,c)
returns a,b,c for the local minima found.
"""
if neighborhood.shape[0]<5:
return None
sol = leastsq(residuals, p0, args=(None, neighborhood.T))[0]
return sol
def f_min(X, p):
"""
plane function to minimize.
"""
ab = p[0:2]
distance = (ab*X[:2].T).sum(axis=1) + p[2] - X[2]
return distance
def residuals(params, signal, X):
"""
residuals for least mean squares
"""
return f_min(X, params)
p0 = np.random.uniform(-50, 50, size=(3,1))
sol = least_squares(neighborhood,p0)
这是一种方法:
给定 N 个 X、Y、Z 值,您想找到 a、b、c、d 以最小化
Q = Sum{ i | square( (a,b,c)*(X[i], Y[i], Z[i])' - d)}
无论您为 (a,b,c) 选择什么值,使它最小化的 d 值都将是
d = Sum{ i | (a,b,c)*(X[i], Y[i], Z[i])' }/N
= (a,b,c)*(Xbar,Ybar,Zvar)
其中 Xbar 是 X 等的平均值
将其代入 Q 的表达式,我们得到
Q = Sum{ i | square( (a,b,c)*(x[i], y[i], x[i])')}
= (a,b,c)*Sum{ i | (x[i], y[i], x[i])' * (x[i], y[i], x[i])}*(a,b,c)'
= (a,b,c)*M*(a,b,c)'
其中 x[i] = X[i]-xbar,y[i]=Y[i]-ybar 等
M = Sum{ i | (x[i], y[i], x[i])' * (x[i], y[i], x[i])}
标准化 (a,b,c) 的 q 的最小值将是 M 的最小特征向量,然后 (a,b,c) 将是该特征值的特征向量。
所以程序是:
a/ 计算坐标的均值 xbar、ybar、zbar 并从 x[]、y[]、z[]
中减去这些
b/ 形成矩阵M并将其对角化
c/ M 的最低特征值的特征向量给出 (a,b,c)
d/ 通过
计算 d
d = (a,b,c)*(xbar,ybar,zbar)'
我正在尝试使用 scipy.optimize.leastsq.
将 3d 点拟合到 2.5d/3d 中的平面我正在尝试最小化函数:ax + by + c - z
当我向生成的平面添加噪声时,我开始得到 (a,b,c) 的不同结果,而 a 和 b 之间的线性关系仍然正确。
我的问题:有没有办法约束拟合参数的归一化?
我可以在优化后进行归一化,运行 再次搜索最后一个参数,但感觉效率低下并且会导致参数 c 发生很大变化,有什么建议吗?
谢谢!
以下是我在同一架飞机上得到的一些不同结果:
[ 12.88343415 6.7993803 4001.717 ]
[ 14.52913549 7.44262692 3201.1523]
[ 4.37394650e+00 2.20546734e+00 9.56e+03]
[ 24.32259278 12.32581015 -2748.026]
通过 sqrt(a2 +b2 +1) 归一化后:
[-0.97401694 0.20292819 -6.16468053]
[-0.97527745 0.1976869 -2.46058884]
[-0.97573799 0.19342358 5.42282738]
[ -0.97894621 0.17992336 13.52561491]
[ -0.97821728 0.17834579 24.5345626 ]
代码:
def least_squares(neighborhood,p0):
"""
computes the least mean squares solution for points in neighborhood.
p0 is the initial guess for (a,b,c)
returns a,b,c for the local minima found.
"""
if neighborhood.shape[0]<5:
return None
sol = leastsq(residuals, p0, args=(None, neighborhood.T))[0]
return sol
def f_min(X, p):
"""
plane function to minimize.
"""
ab = p[0:2]
distance = (ab*X[:2].T).sum(axis=1) + p[2] - X[2]
return distance
def residuals(params, signal, X):
"""
residuals for least mean squares
"""
return f_min(X, params)
p0 = np.random.uniform(-50, 50, size=(3,1))
sol = least_squares(neighborhood,p0)
这是一种方法: 给定 N 个 X、Y、Z 值,您想找到 a、b、c、d 以最小化
Q = Sum{ i | square( (a,b,c)*(X[i], Y[i], Z[i])' - d)}
无论您为 (a,b,c) 选择什么值,使它最小化的 d 值都将是
d = Sum{ i | (a,b,c)*(X[i], Y[i], Z[i])' }/N
= (a,b,c)*(Xbar,Ybar,Zvar)
其中 Xbar 是 X 等的平均值
将其代入 Q 的表达式,我们得到
Q = Sum{ i | square( (a,b,c)*(x[i], y[i], x[i])')}
= (a,b,c)*Sum{ i | (x[i], y[i], x[i])' * (x[i], y[i], x[i])}*(a,b,c)'
= (a,b,c)*M*(a,b,c)'
其中 x[i] = X[i]-xbar,y[i]=Y[i]-ybar 等
M = Sum{ i | (x[i], y[i], x[i])' * (x[i], y[i], x[i])}
标准化 (a,b,c) 的 q 的最小值将是 M 的最小特征向量,然后 (a,b,c) 将是该特征值的特征向量。
所以程序是:
a/ 计算坐标的均值 xbar、ybar、zbar 并从 x[]、y[]、z[]
中减去这些b/ 形成矩阵M并将其对角化
c/ M 的最低特征值的特征向量给出 (a,b,c)
d/ 通过
计算 dd = (a,b,c)*(xbar,ybar,zbar)'