• ベストアンサー

曲面フィット

こんにちは、早速ですが 2つの入力変数(X1とX2)と1つの出力変数(Y)があり、 このデータを3D散布図に描くと曲面展開できそうな (ねじれた平面?)形になりました。 が、カーブフィットの方法がわかりません。 簡単な2Dのフィッティングは最小二乗など使って 何度かやったことあるんですけど 独立変数が複数になるとさっぱりわからなくなりました。 どなたかご教授ください。 またこのようなフィッティングが簡単にできる おすすめのグラフソフトなどあれば教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.3

モデルがデータに合わない場合、手っ取り早いのはモデルを多項式として、その次数を上げていくことです。この場合まずは双2次式かな?つまり f(X1,X2) = α(X2) X1^2 + β(X2) X1 + γ(X2) α(X2) = A X2^2 + B X2 + C β(X2) = D X2^2 + E X2 + F γ(X2) = G X2^2 + H X2 + I の9パラメータのモデルですね。パラメータA,B,C,....,Iについてfは1次式ですから、線形最小二乗法が使えます。 これでダメなら双3次式。 がんばろー!

pickelman
質問者

補足

度々ありがとうございます。 やはり多項式で次数を増やしていくのが手っ取り早いんですね。 双3次式まで計算したらかなり良い結果が得られました。 いろいろ教えていただいてありがとうございました。

その他の回答 (2)

  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

当て嵌めたいモデルをf(X1,X2)とします。ねじれた平面だったらたとえば f(X1,X2) = AX1X2 + BX1 + CX2 + D のような格好になるでしょうか。で、最小二乗法でA,B,C,Dを決めてやればよい。 データがN個あるとして、それを<X1[j],X2[j],Y[j]> (j=1,2,....,N)とします。そうすると、残差を ε[j] = f(X1[j],X2[j]) - Y[j] と定義して、残差二乗和 S = Σ(ε[j])^2 (Σはj=1,2,...,Nについての和) を最小化したい。ですから連立方程式 ∂S/∂A = 0 ∂S/∂B = 0 ∂S/∂C = 0 ∂S/∂D = 0 を解く。 ∂S/∂A = 2Σ(X1[j] X2[j](AX1[j]X2[j] + BX1[j] + CX2[j] + D - Y[j])) ∂S/∂B = 2Σ(X1[j] (AX1[j]X2[j] + BX1[j] + CX2[j] + D - Y[j])) ∂S/∂C = 2Σ(X2[j] (AX1[j]X2[j] + BX1[j] + CX2[j] + D - Y[j])) ∂S/∂D = 2Σ(AX1[j]X2[j] + BX1[j] + CX2[j] + D - Y[j]) ですから、A,B,C,Dを変数とする連立一次方程式です。 モデルfがもっと他の関数の場合でも同じ要領ですが、モデルがややこしい式だと、解くべき連立方程式が一次方程式にならない場合があります。 そのときには、モデルの表し方を工夫して一次方程式になるように持ってくるか、あるいは「非線形最小二乗法」という繰り返し計算を用います。

pickelman
質問者

補足

ご回答ありがとうございます。 >当て嵌めたいモデルをf(X1,X2)とします。ねじれた平面だったらたとえば >f(X1,X2) = AX1X2 + BX1 + CX2 + D >のような格好になるでしょうか。 そうですね、この関数はねじれた平面ですよね。 この場合たとえばX2を固定するとF(X1,Y)は1次式になりまして、 つまり直線の角度をちょっとずつ変えてできた平面ってことですよね? でも実際には… 仮に下敷きのようなものの両端を両手で持って グィっと捻じ曲げてみたらこんな風にはなりませんよね。(なんかわかりずらい?) あらゆるX2においてF(X1,Y)は曲線になるはずなんですよ。 しかもX2によって曲率が異なる。 こういう場合はもっと複雑な関数を定義しないといけないのでしょうか? この関数のモデルが知りたい! です。 ちなみに f(X1,X2) = AX1X2 + BX1 + CX2 + D でフィッティングしたら残さ二乗が14835になっちゃいました。(ioi)

noname#21649
noname#21649
回答No.1

最小二乗法をご存知とします。 適当なほうてい式が存在するとして.適当な初期値を決定します。 それぞれの定数を少し動かした時の残差を計算します。 時間がかかって良いのであれば.残さの最も少ない場合を選んで.このあたいにたいして.それぞれの定数を少し動かした時の残差を計算します。 残さが十分少なくなった時に.打ち切ります。 時間をかけない(計算回数を少なくする方法には.いろいろありますが.言葉で説明できません。) 私の場合には.ベーシック(言語ソフト)で画面に表示させながら.手作業で変数を適当にいじって残差が少なくなるようにしました。この方法は.各種方法によって選られた最適解が理論上取りうる値を逸脱する場合に確実に収束させる方法です。ただ.それが必ずしも最適解ではないのです。