Python极小值
我试图在点云上拟合一条3D线。我正在使用lmfit的Minimizer。 我将线点距离定义为np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0)(来自的方法2)。问题是,我不确定最小值是否做得好。我使用的是最小二乘法,对于点数较少的情况,拟合不正确 事实上,np.linalg.norm(np.cross(p-v0,v1-v0))似乎做得更好。如果我理解正确,这将最小化平行四边形面积,而不是点线距离 问题:有没有比最小二乘法更好的算法来最小化距离?有比lmfit更好的图书馆吗?为什么第二个方程会给出更好的结果,它只是除以一个标量Python极小值,python,3d,lmfit,Python,3d,Lmfit,我试图在点云上拟合一条3D线。我正在使用lmfit的Minimizer。 我将线点距离定义为np.linalg.norm(np.cross(p-v0,v1-v0))/np.linalg.norm(v1-v0)(来自的方法2)。问题是,我不确定最小值是否做得好。我使用的是最小二乘法,对于点数较少的情况,拟合不正确 事实上,np.linalg.norm(np.cross(p-v0,v1-v0))似乎做得更好。如果我理解正确,这将最小化平行四边形面积,而不是点线距离 问题:有没有比最小二乘法更好的算法
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))
使用plotly,我可以看到拟合的质量:vs“对于较低数量的点,拟合不正确。”-您如何知道它不正确?我使用plotly在三维中查看直线如何拟合点。另外,我知道云的正确角度(0度)。当删除np.linalg.norm(v1-v0)时,我得到了更好的结果。如果只有两个点,我想让线穿过它们,但事实并非如此。