我需要將兩組3D點疊加在一起;即找到旋轉和平移矩陣以使其座標之間的RMSD(均方根偏差)最小化。用於疊加3d點的算法
我目前使用Kabsch algorithm,這在我需要處理的很多情況下並不是非常有用。 Kabsch需要兩個數據集中的點數相同,此外,它需要知道哪個點將與哪個點預先對齊。就我而言,點的數量將會不同,並且我不關心哪個點對應於最終對齊中的哪個點,只要RMSD最小化。因此,該算法將(可能地)在兩個點集的子集之間找到1-1映射,使得在AFTER旋轉&平移之後,RMSD被最小化。我知道一些算法可以處理不同數量的點,但它們都是基於蛋白質的,也就是說,它們嘗試將骨架對齊在一起(某些連續段與另一個連續段對齊),這不是對於漂浮在空間中的點非常有用,沒有任何連接。 (好的,很清楚,有些點是連接的;但有些點沒有任何連接,在疊加期間我不想忽略它們。)
我發現的算法只有DIP-OVL,位於STRAP軟件模塊(open資源)。我嘗試了代碼,但行爲似乎不穩定;有時它會找到很好的對齊方式,有時在一次簡單的X轉換後,它不能將一組點與自己對齊。
任何人都知道處理這些限制的算法嗎?如果表現是一個問題,我最多隻有10^2到10^3個點。
說實話,使用的目標函數不是很清楚。 RMSD定義爲對應點之間的距離的RMS。如果我有兩組有50和100個點的集合,並且算法在這些集合中匹配1個或幾個點,那麼在這些幾個點之間得到的RMSD將爲零,而整體疊加可能不那麼好。 RMSD 全部對點不是更好的解決方案(我認爲)。我可以想到的唯一事情就是找到集合Y中每個點的最接近的點(因此在這種情況下將會有精確的min(| X |,| Y |)匹配,例如50)和根據這些匹配計算RMSD。但距離計算和二部分匹配部分似乎計算複雜,無法以批處理方式調用。在這方面的任何幫助也會有所幫助。
謝謝!
這是一個非常困難的問題。使用不同數量的點時,完全可以找到變換,使得具有較少點的集合是另一個點的子集。此外,根據您的數據,可能會出現許多此類轉換,那麼您如何確定哪個最好?是一種簡單的適合的方法,例如覆蓋每個集合的質心,然後找到最小化RMS的最佳旋轉。還是更需要準確性? – mathematician1975
@ mathematician1975:TBH,問題不像聽起來那樣開放。點的數量通常是相似的,較大的集合可能具有最大值的兩倍,我的目標是找到「a」(非最佳)疊加,以重疊的方式將點的大約30-50%對齊。如果存在完美的旋轉(較小的一組是轉換後的一個子集),那是我正在尋找的完美情況。否則,它應該減小尺寸,直到做出可接受的匹配。質心可能是好的,但想一想:一個球體和一個半球。它們的質心在完美對齊中不同。 – froost
沒有明確的遷移路徑。這是關於這個話題的,但可能太學術化了,無法得到你需要的牽引力。您可能需要檢查Metas是否有相關的遷移路徑。聯繫了[cstheory.se]國防部,他認爲這不太適合。 [gamedev.se]或[cs.se]可能會獲得更多的牽引力,但我不確定。 – Will