プロが教えるわが家の防犯対策術!

いくつかのデータから最小二乗法で近似曲線を求めたいのですが、よくわかりません。そのデータ集の近似曲線は円になります。
最小二乗法を調べ、1次、2次関数についてはわかりました。ある点の座標を(x1,y1), (x2,y2)…、近似曲線上の座標を(x1,y’1),(x2,y’2)… とした時、
(y’1-y1)^2 + (y’2-y2)^2 … が最小となるような係数a,b などを偏微分 → 連立方程式で求めるという方法でした。
円についても、同様の方法で r^2 = (x-a)^2 + (y-b)^2 のような近似曲線の式が求められるのでしょうか?1次関数などのように、y’1-y1を求めようとすると、±√ が出てきてしまい、ややこしくなる気がしますが、これを解くしかないのでしょうか?もしくは別の解法があるのでしょうか?詳しく教えていただけたらと思います。よろしくお願いします。

A 回答 (2件)

円の場合は中心対称なので、普通の最小二乗法のような y の値の差の2乗でなく、半径の2乗の差の総和をゼロとする方法が良いと思います数学的には適切ではないかもしれませんが、実験データをモデルに当てはめるような目的なら問題ないと思います。

乱数で値をばらつかせた100組のデータで実際計算してみましたが、うまくフィッティングできました。

当てはめる円の方程式を
   ( x - x0 )^2 + ( y - y0 )^2 = r^2
としたとき、n個のデータ組( xi, yi )に対する半径の2乗の差の総和
   S = Σ{ r^2 - ( xi - x0 )^2 - ( yi - y0 )^2 } --- (1)
がゼロとなる x0, y0, r の値は
   x0 = ( Σxi )/n
   y0 = ( Σyi )/n
   r = = √{ ( Σxi^2 + Σyi^2 )/n - ( x0^2 + y0^2 ) }
になります( x0, y0 はそれぞれ xi, yi の単なる加算平均になります)。

(x0, y0, r の計算方法)
x0 と y0 を変化させたとき S が最小となるのは
   ∂S/∂x0 = -2*Σ ( xi - x0 ) = -2*( Σxi - Σx0 ) = -2*( Σxi - n*x0 ) = 0
   ∂S/∂y0 = -2*Σ ( yi - y0 ) = -2*( Σyi - Σy0 ) = -2*( Σyi - n*y0 ) = 0
となるときなので
   x0 = ( Σxi )/n、y0 = ( Σyi )/n --- (2)
一方、式(1)を展開すれば
   S = Σ{ r^2 - ( xi - x0 )^2 - ( yi - y0 )^2 }
     = n*r^2 -Σxi^2 -Σyi^2 + 2*x0*Σxi + 2*y0*Σyi - n*( x0^2 + y0^2 )
なので、これがゼロとなるためには
    r = √[ { Σxi^2 +Σyi^2 - 2*x0*Σxi - 2*y0*Σyi + n*( x0^2 + y0^2 ) }/n ]
でなければなりません。
式(2)から
    Σxi = n*x0、Σyi = n*y0
なので
    r = √[ { Σxi^2 +Σyi^2 - n*( x0^2 + y0^2 ) }/n ]
     = √{ ( Σxi^2 + Σyi^2 )/n - ( x0^2 + y0^2 ) }
    • good
    • 0

本当のところ、最小二乗法はデータの構造がどうなっているかを推定する


必要があります。実際、

>(y’1-y1)^2 + (y’2-y2)^2 … が最小

これは誤差が目的変数に直接と仮定しているからです。

Y=f(x)+ε
Σε^2=Σ{Y-f(x)}^2

最小二乗法はだから、各データから最小の『距離』の式が出るわけでは
なく、Y軸方向の誤差が最小になるような式を与える係数が算出されます。
なので、最小二乗法関連の本やURLを見ると例外なく直線から上下に
誤差を示す矢印が出ていると思います。(直線から垂直ではなく)

逆に言えば誤差に触らないような式変形なら割と自由に出来ます。
円の式が
r^2=(x-a)^2+(y-b)^2+ε
ならば
r^2=x^2-2ax+a^2+y^2-2by+b^2+ε
(x^2+y^2)=-2ax-2by+(a^2+b^2-r^2)+ε
これは
Z=AX+BY+C  (ただし、Z=x^2+y^2,X=-2x,Y=-2y)
に回帰しているのと変わりません。
これでA,B,Cを計算した後、変形して円の式に戻せばいいのです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!