Python最小化器

时间:2017-07-07 09:50:54

标签: python 3d lmfit

我正在尝试在点云上安装3D线。我正在使用lmfit的迷你冰箱。 我将线点距离定义为 np.linalg.norm(np.cross(p-v0,v1-v0))/ np.linalg.norm(v1-v0)(方法2来自{ {3}})。问题是我不确定minimer做得好。我使用最小二乘法,并且对于较低数量的点,拟合是不正确的。

事实上, np.linalg.norm(np.cross(p-v0,v1-v0))似乎做得更好。如果我理解正确,这将最小化平行四边形区域而不是点线距离。

问题:是否有更好的算法,然后最小化方法,以尽量减少距离?有没有比lmfit更好的图书馆?为什么第二个等式会得到更好的结果,它只是用标量划分?

from lmfit import minimize, Parameters, Parameter, 
report_fit,fit_report, Minimizer, printfuncs
import numpy as np

params = Parameters()
params.add('x0',   value= 129)
params.add('x1',   value= -0.5)
params.add('y0',   value= 129)
params.add('y1',   value= -0.5)


def fun(params,x,y,z):
    x0 = params['x0'].value; x1 = params['x1'].value; y0 = 
params['y0'].value; y1 = params['y1'].value
    distance = []

    v0 = np.array([x0, y0, 0])
    v1 = np.array([x0+x1, y0+y1, 1])

    for point in range(len(x)):
        p = np.array([x[point], y[point], z[point]])
        distance.append(np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0))
    return distance

result = minimize(fun, params,args=(x,y,z))
print(fit_report(result))

使用情节我可以看到适合的质量:http://www.qc.edu.hk/math/Advanced%20Level/Point_to_line.htm vs np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0)

0 个答案:

没有答案