我正在尝试在点云上安装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)