2012-06-23 63 views
2

我需要將兩組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。但距離計算和二部分匹配部分似乎計算複雜,無法以批處理方式調用。在這方面的任何幫助也會有所幫助。

謝謝!

+0

這是一個非常困難的問題。使用不同數量的點時,完全可以找到變換,使得具有較少點的集合是另一個點的子集。此外,根據您的數據,可能會出現許多此類轉換,那麼您如何確定哪個最好?是一種簡單的適合的方法,例如覆蓋每個集合的質心,然後找到最小化RMS的最佳旋轉。還是更需要準確性? – mathematician1975

+0

@ mathematician1975:TBH,問題不像聽起來那樣開放。點的數量通常是相似的,較大的集合可能具有最大值的兩倍,我的目標是找到「a」(非最佳)疊加,以重疊的方式將點的大約30-50%對齊。如果存在完美的旋轉(較小的一組是轉換後的一個子集),那是我正在尋找的完美情況。否則,它應該減小尺寸,直到做出可接受的匹配。質心可能是好的,但想一想:一個球體和一個半球。它們的質心在完美對齊中不同。 – froost

+1

沒有明確的遷移路徑。這是關於這個話題的,但可能太學術化了,無法得到你需要的牽引力。您可能需要檢查Metas是否有相關的遷移路徑。聯繫了[cstheory.se]國防部,他認爲這不太適合。 [gamedev.se]或[cs.se]可能會獲得更多的牽引力,但我不確定。 – Will

回答

1

如果知道哪對點相互對應,則可以使用Linear Least Squares(LLS)恢復變換矩陣。

當考慮LLS時,您通常會想要在A*x = b中找到近似值x。通過轉置,您可以解決A而不是x

  1. 擴展每個源和目標矢量用 「1」,所以它們看起來像< XÿŽ,1 >
  2. 等式:&middot; X = b
  3. 擴展到多個載體:&middot; X =
  4. 移調:(&middot; XŤ = Ť
  5. 簡化: XŤ&middot; Ť = Ť
  6. 替代 P = XŤ Q = Ť - [R = Ť。結果是: P&middot; Q = - [R
  7. 申請LLS下式: Q&#x2248; ( PŤ&middot; P-1&middot; PT&middot; R
  8. 替補回: AT&#x2248; ( X&middot; XT-1&middot; X&middot; Ť
  9. 求解,並簡化:&#x2248; B&middot; XT&middot; ( X&middot; XŤ-1

&middot; XŤ)和( X&middot; XŤ)可以通過將各個向量對的外積相加來迭代計算。

  • B&middot; XT = ∑ b i&middot; X Ť
  • X&middot; XT = ∑ x i&middot; X Ť
  • &#x2248; (∑ b &middot; X Ť)&middot; (∑ X &middot; X Ť-1

否矩陣將是大於4 × 4,所以該算法沒有使用任何過多的內存。

結果不一定是彷彿,但可能接近。隨着一些進一步的處理,你可以使它彷彿。

0

通過疊加發現對齊的最佳算法是Procrustes Analysis或Horn's方法。請按照this Stackoverflow link