我正在使用以下代码在 3D 点云上拟合 3D 线。我正在使用lmfit的最小二乘法来最小化。
我需要为不同的点添加权重,但在使用数组(而不是标量)距离输出时不知道该怎么做。使用标量时的问题是它不如使用数组时好。我假设是因为变量数量较多。
所以问题是 - 有没有办法将数组的每个元素的权重添加到最小化器?使用像 Nelder w/scaral 输入的东西不能很好地执行 3D 拟合。
from lmfit import minimize, Parameters, Parameter,report_fit,fit_report, Minimizer, printfuncs
import numpy as np
#parameters
params = Parameters()
params.add('y1', value= 0)
params.add('x0', value= 129)
params.add('x1', value= 0)
params.add('y0', value= 129)
params.add('y1', value= 0)
#function calculating point-line distance
def fun(params,x,y,z):
x0 = params['x0'].value; x1 = params['x1'].value; y0 = params['y0'].value; y1 = params['y1'].value
distance = []
#parametric equations
v0 = np.array([x0, y0, 0])
v1 = np.array([x0+x1,y0+ y1, 1])
#for loop over all the 3D points to calculate distance
for point in range(len(x)):
p = np.array([x[point], y[point], z[point]])
distance.append(np.linalg.norm(np.cross(v0-p,v0-v1)))
return distance
result = minimize(fun, params,args=(x,y,z))
print(fit_report(result))
theta = np.arccos(1/ np.sqrt(result.params['x1']*result.params['x1']+result.params['y1']*result.params['y1']+1))