使用lmfit在点云上拟合3D线时添加权重

时间:2017-07-25 15:02:02

标签: python least-squares lmfit

我使用以下代码在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))

1 个答案:

答案 0 :(得分:0)

我想您已经阅读了有关如何编写目标函数的文档(this answer,如您在其他一个问题中提供的那样)?如果是这样,描述的哪一部分不清楚和/或你尝试了什么并且没有用?

在您的示例中,您将生成一个名为distance的数组,该数组与文档中的(model-data)实际上相同。您要在此处添加的是eps,它会根据数据中的不确定性来缩放残差。