ページ 1 / 1
最小二乗円
Posted: 2007年5月01日(火) 20:17
by noel
円の輪郭を示す、ランダムな座標群(Xi,Yi)がある時に、その座標を用いて、最小二乗法で、円の半径や中心を求める方法はありませんか?
よろしくお願いいたします。
Re:最小二乗円
Posted: 2007年5月01日(火) 23:54
by box
座標群(X<sub>i</sub>,Y<sub>i</sub>)は、必ず円周上にあるのですか?
また、どうしても最小二乗法を使わないとダメですか?
もし、3点以上から成る座標群が必ず円周上にあって、
最小二乗法を使わなくてもよいのであれば、
座標群から任意の2点を2組取り出し、各2点の垂直二等分線の交点から
中心座標が求まり、座標群の任意の点と中心座標との距離が円の半径となります。
ご存じだとは思いますけれども。
最小二乗法を今回の問題にどう適用すればよいかは、よくわかりません。
他の方からの回答をお待ちください。
Re:最小二乗円
Posted: 2007年5月02日(水) 08:53
by noel
比類無きプログラマーさん、ありがとうございます。
必ず円周上にあるわけではなく、円周周辺にランダムにあります。
しかも、一部角度の座標は、欠落している場合もあります。
そこでそれらの点群からベストフィットする円を求めたいのです。
なので最小二乗法が良いのかと?思っています。
特に最小二乗法にこだわるわけではありません、ベストフィットする円を求めたいだけなのです。
よろしくお願いいたします。
Re:最小二乗円
Posted: 2007年5月02日(水) 08:55
by noel
すみません、お名前を間違えてしましました。
boxさん、ありがとうございます。
Re:最小二乗円
Posted: 2007年5月02日(水) 09:33
by box
> 必ず円周上にあるわけではなく、円周周辺にランダムにあります。
それはそうですよね。
円の周辺にある、ばらつきを持った点の集まりをもとに、
いちばんフィットする円を見つけ出すのが最小二乗法の目的ですものね。
今回の場合はXもYも2次式ですからね。
どういう風にすれば最小二乗法(あるいはその他の方法)を使って
答えが求まるか、ちょっと見当がつかないです。
申し訳ありません。
Re:最小二乗円
Posted: 2007年5月02日(水) 12:39
by 組木紙織
携帯から失礼します。
詳しく書けませんが、
円を与えて、その円との差を考えてみてください。
多変量解析の辺りが参考になると思います。
Re:最小二乗円
Posted: 2007年5月02日(水) 13:45
by 管理人
全ての組み合わせで2点の直線を作り、その出てきた交点の中心を取ったのではだめなんでしょうかね・・。
すみません、よくわかりませんが。
Re:最小二乗円
Posted: 2007年5月02日(水) 17:36
by noel
回答ありがとうございます。
円周上の座標が正確な場所と微妙に不正確な座標があり、正確な場所の数の方が多いのですが、不正確な座標に足を引っ張られるケースが多いのです。
ですので、最小二乗法などを使うとベストフィットするのでは???と考えたしだいであります。
きっと組木紙織さまの言われる「円を与えて、その円との差を考えてみてください。」と考え方は同じになるのかな?なんて思っています。
でも 円の最小二乗法のやり方を思いつきません…
Re:最小二乗円
Posted: 2007年5月06日(日) 22:15
by 組木紙織
少し考えてみたのですが、かなり難しいです。
いや考え方は難しくはないのですが、式がかなり複雑になるので計算が大変でした。
一番単純な
「中心が原点にある場合」
をやってみます。
与えられた座標を(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:最小二乗円
Posted: 2007年5月12日(土) 21:17
by しっぽ
こんなのでどうでしょうか。
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.あとは
探索初期値の中心座標を初期の否探査領域とし、非探査領域を囲むく領域と
比較する
言葉で書くと何のこっちゃ!言葉は難しいです。コードで語りたいのですが
▼【エラー】 申し訳ありません。メッセージが長すぎます。
だそうです。