移动最小二乘法拟合点位移有问题

Moving least squares fitting for point displacements having issues

问题说明: 我在两个以上的不同时间点有 (x,y,z) 坐标。为方便起见,可以将它们想象成沿着倒抛物面的不规则 spaced 个点。 抛物面有一些最小厚度。随着时间的推移,抛物面会略微改变形状(就像气球膨胀一样),当它这样做时,所有的点都会移动。 通过减去time2 - time1的坐标,我可以得到每个点的位移矢量。

需要注意的是(我怀疑这可能是问题的根源)在第一个时间点,x和y坐标的范围是0到2000,z坐标都在一个较窄的范围内范围 - 比如 350 到 450。在变形过程中,每个点都有位移的 x 分量、y 分量和 z 分量。 x 和 y 分量很小(最多约 50),而 z 分量最大(在中心附近达到 400,在边缘附近更小)。

在每个点的位置使用加权移动最小二乘法,我试图根据点的原始 x、y、z 坐标将位移分量拟合到二次多项式曲面:例如。

的 x 分量
displacement = ax^2 + bxy + cx + dy^2.. + hz^2 + iz + j

我在 MATLAB 中使用 lsqr 函数,像这样,在每个时间间隔循环遍历每个点:

Ux = displacements{k,1}(:,1);
Cx = lsqr((adjust_B_matrix'*W*adjust_B_matrix),(adjust_B_matrix'*W*Ux),1e-7,10000); 

W 是权重矩阵,adjust_B_matrix 是时间 1 处所有 (x,y,z) 坐标的矩阵,移动后它们都以点为中心我正在尝试适应这个功能。

出了什么问题? 它只是不起作用——一旦我有了这些功能,它们就会重新以点的实际坐标为中心。 但是一旦我通过将时间 1 的坐标插入现在发现的函数来绘制结果点(初始点 x + 位移 x,初始点 + 位移,初始点 z + 位移 z),它只是吐出一个看起来就像表面的表面在时间 1.

可能出了什么问题?我尝试过的事情:

  1. 这不是代码本身的问题 - 我使用点网格生成了 'fake' 数据并且它运​​行良好。预测位置与实际坐标叠加,我能够恢复我开始使用的功能。但是在我的试用示例中,我使用了从 0 到 5 的 x,y,z,均匀 spaced.
  2. 全局拟合有效(但我需要局部拟合...)。 我尝试了 MATLAB 的曲线拟合工具箱,并尝试将其中一个位移拟合到全局 x 和 y 坐标。效果很好。
  3. 认为 我不应该有奇异矩阵问题,因为我在计算中使用了大半径(大约 75-80)点,在 3D 中有些分散 space.

怀疑: 我认为这与初始(x,y,z)坐标分布不均匀有关,但我不知道为什么或如何解决这个问题,甚至我可以使用什么方法。

如果你读到这里,非常感谢。任何建议将不胜感激。

图供参考: 绿色 = 时间 2 的预测点。大部分与红色重叠,即时间 1 点的实际坐标。 蓝色是时间 2 点的正确坐标(这是绿色坐标 应该 如果一切正常的话)。

image

已更新 link 文件: http://a.tmp.ninja/eWfkNmFZyTFk.zip 内容 - 代码、示例数据(请加载 .mat 文件)。

我实际上无法访问您发布的代码,所以这里有一些一般性建议。

看起来曲线拟合工具箱中的工具确实可以满足您的需求,请查看本页底部:https://www.mathworks.com/help/curvefit/polynomial.html#bt9ykh

无论您学习的位移函数是什么,它看起来都非常小或处处为零。我怀疑这个问题只是你管道中某个地方的一个小问题 typo/error,可能翻译你必须使用 fit 函数工作的内容会揭示这个问题。

这真的不应该是问题,但将来如果你有更多不平衡的数据,你可以在拟合之前将它们全部归一化 (x_norm = (x - x_mu)/x_std).

另外,我也不认为这是你的问题,但你可以通过使用 cord() 函数检查条件数来检查你的矩阵是否接近单数。所以你可以检查条件(adjust_B_matrix'Wadjust_B_matrix)。其次,如果您查看 lsqr 的文档,有一个选项可以获取调试 return 标志,这也值得一试。