我需要将两组 3D 点叠加在一起;即找到旋转和平移矩阵以最小化它们坐标之间的RMSD(均方根偏差)。
我目前使用Kabsch 算法,这对于我需要处理的许多情况都不是很有用。Kabsch 要求两个数据集中的点数相等,此外,它需要事先知道哪个点将与哪个点对齐。就我而言,点的数量会有所不同,我不在乎哪个点对应于最终对齐中的哪个点,只要 RMSD 最小化即可。
因此,该算法将(可能)找到两个点集的子集之间的 1-1 映射,以便在旋转和平移之后,RMSD 最小化。
我知道一些处理不同数量点的算法,但是它们都是基于蛋白质的,也就是说,它们试图将主干对齐在一起(一些连续段与另一个连续段对齐等),这对于点浮动没有用在太空中,没有任何联系。(好吧,要清楚,有些点是连接的;但是有些点没有任何连接,我不想在叠加过程中忽略这些点。)
我发现的唯一算法是DIP-OVL,在 STRAP 软件模块(开源)中找到。我尝试了代码,但行为似乎不稳定;有时它会找到很好的对齐方式,有时它无法在简单的 X 平移后将一组点与自身对齐。
有人知道处理这种限制的算法吗?如果性能有问题,我最多会得到 ~10^2 到 ~10^3 分。
老实说,要使用的目标函数不是很清楚。RMSD定义为对应点之间距离的RMS 。如果我有两组分别为 50 和 100 点,并且算法匹配组内的 1 个或几个点,那么这几个点之间的 RMSD 将为零,而整体叠加可能不会那么大。所有点对之间的 RMSD并不是更好的解决方案(我认为)。
我能想到的唯一一件事就是为集合 Y 中的每个点找到集合 X 中的最近点(因此将有准确的 min(|X|,|Y|) 匹配,例如在这种情况下为 50)并从中计算 RMSD火柴。但是距离计算和二分匹配部分似乎计算复杂,无法以批处理方式调用。该领域的任何帮助也会有所帮助。
谢谢!