超定义平面的计算梯度

时间:2020-11-10 20:47:33

标签: python numpy math linear-regression svd

我想计算一个超定义平面(> 3个点)的梯度(方向和大小),例如四个x,y,z坐标:

[0,0,1],[1,0,0],[0,1,1],[1,1,0]

enter image description here

我用于计算梯度的代码如下(使用this post的奇异值分解,已修改):

import numpy as np
def regr(X):
    y = np.average(X, axis=0)
    Xm = X - y
    cov = (1./X.shape[0])*np.matmul(Xm.T,Xm)   # Covariance
    u, s, v = np.linalg.svd(cov)               # Singular Value Decomposition
    return u[:,1]

但是我得到了:

[0,1,0]

既不代表梯度也不代表法线向量。结果应如下所示:

[sqrt(2)/ 2,0,-sqrt(2)/ 2]

有什么主意为什么我得到错误的向量吗?

1 个答案:

答案 0 :(得分:1)

您可以为此使用功能numpy.gradient。这是math background的工作方式。

简而言之:

方向导数将是梯度与方向(单位归一化)矢量的点积。

一个更简单的解决方案是使用numdifftools,尤其是便捷功能directionaldiff。 可以找到一个示例here。而且,如果您查看source code,就会发现与上述数学的关系。

相关问题