円の輪郭を示す、ランダムな座標群(Xi,Yi)がある時に、その座標を用いて、最小二乗法で、円の半径や中心を求める方法はありませんか?
よろしくお願いいたします。
最小二乗円
Re:最小二乗円
少し考えてみたのですが、かなり難しいです。
いや考え方は難しくはないのですが、式がかなり複雑になるので計算が大変でした。
一番単純な
「中心が原点にある場合」
をやってみます。
与えられた座標を(x_i,y_i)とします。
中心からその点までの距離をd',円の半径をr,円から点までの距離をdとします。
d' = sqrt((x_i)^2 + (y_i)^2)
d =|d' - r|
よって、
d^2 = (x_i)^2 + (y_i)^2 - 2r*sqrt((x_i)^2 + (y_i)^2) + r^2
総和を考えて
sig(d^2) = sig((x_i)^2 + (y_i)^2 - 2r*sqrt((x_i)^2 + (y_i)^2) + r^2)
この式の最小値を取るrの値が、この場合の答えです。
微分して考えるのが一番楽なのかな。
これは原点に中心がある場合なのでrで微分すれば話を進められるのですが、
中心の場所が分からない場合はそれぞれの変数で偏微分して考えないと解けないと思う。
大学(数学科?)レベルの問題ですね。
今はこのくらいまでですが、自分が気になるのでもう少し考えてみます。
いや考え方は難しくはないのですが、式がかなり複雑になるので計算が大変でした。
一番単純な
「中心が原点にある場合」
をやってみます。
与えられた座標を(x_i,y_i)とします。
中心からその点までの距離をd',円の半径をr,円から点までの距離をdとします。
d' = sqrt((x_i)^2 + (y_i)^2)
d =|d' - r|
よって、
d^2 = (x_i)^2 + (y_i)^2 - 2r*sqrt((x_i)^2 + (y_i)^2) + r^2
総和を考えて
sig(d^2) = sig((x_i)^2 + (y_i)^2 - 2r*sqrt((x_i)^2 + (y_i)^2) + r^2)
この式の最小値を取るrの値が、この場合の答えです。
微分して考えるのが一番楽なのかな。
これは原点に中心がある場合なのでrで微分すれば話を進められるのですが、
中心の場所が分からない場合はそれぞれの変数で偏微分して考えないと解けないと思う。
大学(数学科?)レベルの問題ですね。
今はこのくらいまでですが、自分が気になるのでもう少し考えてみます。
Re:最小二乗円
こんなのでどうでしょうか。
1.座標を配列にし、解析しやすいように変形する。
座標の配列をX座標でソートする
座標をX座標で3領域(A,B,C)に分割する
2.3つの座標から円の中心座標を求める。
座標の3領域から1点づつ選び出す(A[j], B[j], C[j])
3.おおまかな円の中心座標を探す。
2の操作を(座標数 / 3)点行い、中心座標の候補を配列に保存する
上記配列のX座標のメディアン値を円の中心座標の探索初期値とする
Y座標にについても同様の処理をする
4.中心座標の探索初期値に対して、2乗誤差が最も小さくなる半径を
半径の探索初期値とする
5.あとは
探索初期値の中心座標を初期の否探査領域とし、非探査領域を囲むく領域と
比較する
言葉で書くと何のこっちゃ!言葉は難しいです。コードで語りたいのですが
▼【エラー】 申し訳ありません。メッセージが長すぎます。
だそうです。
1.座標を配列にし、解析しやすいように変形する。
座標の配列をX座標でソートする
座標をX座標で3領域(A,B,C)に分割する
2.3つの座標から円の中心座標を求める。
座標の3領域から1点づつ選び出す(A[j], B[j], C[j])
3.おおまかな円の中心座標を探す。
2の操作を(座標数 / 3)点行い、中心座標の候補を配列に保存する
上記配列のX座標のメディアン値を円の中心座標の探索初期値とする
Y座標にについても同様の処理をする
4.中心座標の探索初期値に対して、2乗誤差が最も小さくなる半径を
半径の探索初期値とする
5.あとは
探索初期値の中心座標を初期の否探査領域とし、非探査領域を囲むく領域と
比較する
言葉で書くと何のこっちゃ!言葉は難しいです。コードで語りたいのですが
▼【エラー】 申し訳ありません。メッセージが長すぎます。
だそうです。