Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

球面フィッティングの導出と実装

511 views

Published on

球面フィッティングの導出とPythonでの実装について

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

球面フィッティングの導出と実装

  1. 1. 球面フィッテイングの 導出と実装 ロケット小僧 2018/2/20
  2. 2. はじめに • 適当にやったから,合ってるかは保証できないです.
  3. 3. やりたいこと • 球面に沿っているはずの3次元データから、中心と半径を求めたい 中心:(X0,Y0,Z0) 半径:r ロケットを飛ばして測定した 3次元地磁気データ(61800個)
  4. 4. 最小二乗法 1. データ列がどんな関数に一致するかは知っている • 例:𝑦 = 𝑎𝑥 + 𝑏 2. 残差の二乗和でコスト関数を設定する. • 例:i番目のデータを(Xi,Yi)とするとき • Σ 𝑎𝑋𝑖 + 𝑏 − 𝑌𝑖 2とか y = 1.9524x + 0.2508 R² = 0.9912 0 2 4 6 8 10 12 14 16 18 20 0 1 2 3 4 5 6 7 8 9 10 y=2x+1 + (-1から1までランダム)
  5. 5. 最小二乗法 3. コスト関数が最小になるように係数を決定する. • 例なら,aやbで偏微分して0になるときの値 • 𝜕Σ 𝑎𝑋 𝑖+𝑏 −𝑌 𝑖 2 𝜕𝑎 = 0 のときのaの値 • 𝜕Σ 𝑎𝑋 𝑖+𝑏 −𝑌 𝑖 2 𝜕𝑏 = 0 のときのbの値 y = 1.9524x + 0.2508 R² = 0.9912 0 2 4 6 8 10 12 14 16 18 20 0 1 2 3 4 5 6 7 8 9 10 y=2x+1 + (-1から1までランダム)
  6. 6. 球面の関数 • 中心を(X0,Y0,Z0)とする半径rの球面の式 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 = 𝑟2 • 右辺を左辺に移項 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 − 𝑟2 = 0
  7. 7. 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 − 𝑟2 の意味 • 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 − 𝑟2 = 0のとき 点(x,y,z)が球面上 • 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 − 𝑟2 > 0のとき 点(x,y,z)が中心より離れすぎている. • 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 − 𝑟2 < 0のとき 点(x,y,z)が中心に近すぎている.
  8. 8. コスト関数 • 𝑥 − 𝑋0 2 + 𝑦 − 𝑌0 2 + 𝑧 − 𝑍0 2 − 𝑟2は正負の値を持つので, コスト関数には不適 • 二乗して和をとってコスト関数とする. • コスト関数 Σ{ 𝑥𝑖 − 𝑋0 2 + 𝑦𝑖 − 𝑌0 2 + 𝑧𝑖 − 𝑍0 2 − 𝑟2 } 2
  9. 9. コスト関数の書き換え • コスト関数 Σ{ 𝑥𝑖 − 𝑋0 2 + 𝑦𝑖 − 𝑌0 2 + 𝑧𝑖 − 𝑍0 2 − 𝑟2 } 2 X0,Y0,Z0,rに関して4次関数 →偏微分して0でも最小とは限らない.
  10. 10. コスト関数の書き換え • 書き換える 𝐹 𝐴, 𝐵, 𝐶, 𝐷 = Σ(𝑥𝑖 2 +𝑦𝑖 2 + 𝑧𝑖 2 + 𝐴𝑥𝑖 + 𝐵𝑦𝑖 + 𝐶𝑧𝑖 + 𝐷)2 𝐴 = −2𝑋0 𝐵 = −2𝑌0 𝐶 = −2𝑍0 𝐷 = 𝑋0 2 + 𝑌0 2 + 𝑍0 2 − 𝑟2
  11. 11. コスト関数が最小な条件を求める 𝜕𝐹 𝜕𝐴 = Σ2𝑥𝑖 𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 + 𝐴𝑥𝑖 + 𝐵𝑦𝑖 + 𝐶𝑧𝑖 + 𝐷 = 0 𝜕𝐹 𝜕𝐵 = Σ2𝑦𝑖 𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 + 𝐴𝑥𝑖 + 𝐵𝑦𝑖 + 𝐶𝑧𝑖 + 𝐷 = 0 𝜕𝐹 𝜕𝐶 = Σ2𝑧𝑖 𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 + 𝐴𝑥𝑖 + 𝐵𝑦𝑖 + 𝐶𝑧𝑖 + 𝐷 = 0 𝜕𝐹 𝜕𝐷 = Σ2 𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 + 𝐴𝑥𝑖 + 𝐵𝑦𝑖 + 𝐶𝑧𝑖 + 𝐷 = 0
  12. 12. 行列にする Σ𝑥𝑖 2 Σ𝑥𝑖 𝑦𝑖 Σ𝑥𝑖 𝑧𝑖 Σ𝑥𝑖 Σ𝑥𝑖 𝑦𝑖 Σ𝑦𝑖 2 Σ𝑦𝑖 𝑧𝑖 Σ𝑦𝑖 Σ𝑥𝑖 𝑧𝑖 Σ𝑦𝑖 𝑧𝑖 Σ𝑧𝑖 2 Σ𝑧𝑖 Σ𝑥𝑖 Σ𝑦𝑖 Σ𝑧𝑖 Σ1 𝐴 𝐵 𝐶 𝐷 = −Σ𝑥𝑖(𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) −Σ𝑦𝑖(𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) −Σ𝑧𝑖(𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) −Σ (𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 )
  13. 13. 行列にする 𝐴 𝐵 𝐶 𝐷 = Σ𝑥𝑖 2 Σ𝑥𝑖 𝑦𝑖 Σ𝑥𝑖 𝑧𝑖 Σ𝑥𝑖 Σ𝑥𝑖 𝑦𝑖 Σ𝑦𝑖 2 Σ𝑦𝑖 𝑧𝑖 Σ𝑦𝑖 Σ𝑥𝑖 𝑧𝑖 Σ𝑦𝑖 𝑧𝑖 Σ𝑧𝑖 2 Σ𝑧𝑖 Σ𝑥𝑖 Σ𝑦𝑖 Σ𝑧𝑖 Σ1 −1 −Σ𝑥𝑖(𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) −Σ𝑦𝑖(𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) −Σ𝑧𝑖(𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) −Σ (𝑥𝑖 2 + 𝑦𝑖 2 + 𝑧𝑖 2 ) A,B,C,DからX0,Y0,Z0,rが求められる.
  14. 14. 実装してみた • Python + NumPy + matplot • SS_fit(data)に球面っぽいデータを与えると,中心と半径のベクトルを 返してくれる. • ソースコード https://github.com/J-ROCKET-BOY/SS-Fitting
  15. 15. 実行結果 中心 X0 = 57.3 Y0 = -10.4 Z0 = 39.2 半径 r = 40.7
  16. 16. 中心が原点になるように平行移動 原点(0,0,0)が中心っぽくなったし, たぶん合ってるんじゃないかな(適当
  17. 17. 参考文献 「一般式による最小二乗法(円の最小二乗法)」-画像処理ソリューション http://imagingsolution.blog107.fc2.com/blog-entry-16.html 「月読アイの理系なお話『最小二乗法』」-ニコニコ動画 http://www.nicovideo.jp/watch/sm30270214

×