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