我使用以下代码在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))
答案 0 :(得分:0)
我想您已经阅读了有关如何编写目标函数的文档(this answer,如您在其他一个问题中提供的那样)?如果是这样,描述的哪一部分不清楚和/或你尝试了什么并且没有用?
在您的示例中,您将生成一个名为distance
的数组,该数组与文档中的(model-data)
实际上相同。您要在此处添加的是eps
,它会根据数据中的不确定性来缩放残差。