0

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

1 回答 1

0

我想您已阅读有关如何编写目标函数的文档(此链接在您的其他问题之一中提供)?如果是这样,描述的哪一部分不清楚和/或您尝试了什么但没有奏效?

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

于 2017-07-28T00:08:43.640 回答