Python 最小化到平面的距离

Python 最小化到平面的距离,python,numpy,geometry,Python,Numpy,Geometry,我在三维空间中有一组点,我知道所有这些点都属于一个平面。但是,这些点中存在一些噪声,所以我不能直接从中提取平面。我想找到最适合这些点的平面公式(ax+by+c*z+d=0)。换句话说,从点到平面的(平方)距离之和应该最小化 我正在使用python和numpy完成所有这些工作,但我似乎不知道如何准确地实现这一点。我对python、scipy和numpy为解决这个问题提供了什么做了更多的研究,我发现这段代码恰好满足了我的需要: def calcBestNormal(points, origin):

我在三维空间中有一组点,我知道所有这些点都属于一个平面。但是,这些点中存在一些噪声,所以我不能直接从中提取平面。我想找到最适合这些点的平面公式(ax+by+c*z+d=0)。换句话说,从点到平面的(平方)距离之和应该最小化


我正在使用python和numpy完成所有这些工作,但我似乎不知道如何准确地实现这一点。

我对python、scipy和numpy为解决这个问题提供了什么做了更多的研究,我发现这段代码恰好满足了我的需要:

def calcBestNormal(points, origin):
p = np.subtract(points, origin)

# Inital guess of the plane
p0 = np.array([0.506645455682, -0.185724560275, -1.43998120646, 1.37626378129])

def f_min(X, p):
    plane_xyz = p[0:3]
    distance = (plane_xyz * X.T).sum(axis=1) + p[3]
    return distance / np.linalg.norm(plane_xyz)

def residuals(params, signal, X):
    return f_min(X, params)

sol = leastsq(residuals, p0, args=(None, p.T))[0]
normal = np.divide(sol[0:3], np.linalg.norm(sol[0:3]))
return normal

如果计算点分布的奇异值分解,则与最小特征值对应的向量将垂直于调整到分布的平面

假设
是一个点矩阵,每行包含一个点:

centroid = np.mean(points, axis=0)               # point on the plane
normal = np.linalg.svd(points - centroid)[2][2]  # plane normal (a,b,c)
d = -centroid.dot(normal)                        # distance to the origin (d)
plane = np.append(normal, d)                     # plane coefficients (a,b,c,d)

这回答了你的问题吗?在我的案例中,我并没有立即想出如何让它起作用(它对某些飞机起作用,但对其他飞机不起作用),然而,我搜索了更多关于这些事情的知识,并发现了一些类似的东西,这对我起到了作用。这里有一个有趣的答案: