FC2ブログ
ITエンジニアの数学
ITエンジニアが出会う業務上の課題、それを「エンジニアのカン」で解決するのではなく「数学の考え方」を使ってアプローチしてみよう、そんな視点でいろいろなことを書いていこうと思います。

全記事

スポンサーサイト
[No.] -------- -- --:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
別窓 | スポンサー広告 | ∧top | under∨
最小二乗法
[No.111] 2012-03-23 Fri 02:14
(多次元版の最小二乗法についてはこちら


実務でデータを解析しなければならない事ってありますよね。
最小二乗法はデータを解析するときに、もっともデータを近似する式を求める為によく使われる方法です。
大学の時に計算の結果だけ使ったっきり、ずっとご無沙汰だって人もたくさんいるかもしれませんね。

さてこの最小二乗法、EXCELには専用関数が用意されています。
「LINEST」という関数です。
データをよく解析する方はこのEXCEL関数を頻繁に使用されているかもしれません。
関数が用意されていることからわかるように、それだけよく使われているメジャーな方法です。


よく利用される最小二乗法ですが、Webを検索してみるとなぜかほとんど一次関数近似の場合しか解説ページが出てきてくれません。
先ほど紹介したEXCEL関数の「LINEST」も一次関数近似しかしてくれません。
実際目にするデータの近似式も、最小二乗法を用いているものはほとんど一次関数近似です。
(解析を専門的に行っている方などは、違うものも目にしているかもしれませんが)
なかには、
 「最小二乗法はデータをよく近似する直線を求めるもので、近似線が曲線になる場合は使えない!」
などと思っている方もいらっしゃってビックリしてしまいました。
もちろん、最小二乗法は直線近似しかできないわけじゃありません。

誤解もされるくらい、こんなにも一次関数近似ばかりが用いられるわけですが。

 でも、世の中で得られるデータのほとんどが一次関数で近似できるものでしょうか?

そんなわけないですよね。
二次関数や三次関数の方がよい近似曲線であったり、三角関数や指数関数のほうがよりより近似値を得られることだってあるはずですよね。
でもそのやり方、計算方法は? というと、Webで調べてもなかなか見つからない。

なので、今回は最小二乗法を用いて任意の初等関数でデータの近似曲線を求めることができように、その導出を書いてみたいと思います。
現在理系学生さんなどでレポートに最小二乗法を使わなきゃいけないけどやり方がわからない! などというような人に役立ててもらえたらと思います。



なるべくわかりやすく書こうと思うのですが、残念ながら「まったく数学わからない人にも分かるように書く」という仕事は私には荷が重いので・・・。
申し訳ないのですが、今回は

 ・偏微分の基礎知識
 ・行列計算の基礎知識
 ・初歩的な数学記号の知識

はあるものとして書かせていただこうと思います。
このあたりの詳しい解説については良書も親切なWebページもたくさんありますので、そちらをご参照ください。


以下、書くことは

 Wikipedia( http://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95 )

に書かれている事と同じで、それを少し丁寧に説明したものです。
Wikipediaの記載でわかる方は、以下読んでいただくと退屈かもしれません・・・。
それでもよろしければお読みいただいて、もし間違い等ありましたらやんわりとご指導いただけたらと思います。
また、以下を読んでいただける方も、先にWikipediaの記述を読んでおいて頂けるとわかりやすいかもしれません。


さて。

まずはじめに「前提」を。
これから最小二乗法の計算をしていく前に、いくつか前提を決めておきましょう。
以下の話はこの前提が成り立っている条件下で展開していきます。

 ・誤差は正規分布に従う
 ・得たい近似関数f(x)は既知の関数g(x)の線形結合で表わされる
 ・測定値はx-y平面上に分布する

の3つです。
最初の一つ目「誤差は正規分布に従う」は大切です。
これは何を言っているかというと、
「近似曲線から大きく離れたデータは比較的少なく、近似曲線の近くのデータは比較的多い」
ということです。
なるべく多くのデータをよりよく近似する曲線を求めたいのですから、これは当然成り立ってほしいところです。
たくさんのデータが近似曲線から離れたところばかりにあったら、その曲線が本当に近似曲線であるのか信用できません。

次の2つ目は「求める近似曲線がいろんな関数の足し算で表わされると仮定するよ」と言っています。
これは計算と考えを簡単にするために大切な仮定です。

最後の3つ目は、データが(x,y)の組で表されていることから仮定されます。
yの値はxの関数で表されるよ、ということを言っています。
もしx-y平面に分布しないとしたら、3次元以上の多次元空間を考えなければいけなくなってしまいます。

以上の前提の下で、最小二乗法の計算を行っていきましょう!


ここから式の登場です。
前提の2番目、「得たい近似関数f(x)は既知の関数g(x)の線形結合で表わされる」を式にすると、

 

となります。
これが出発点です。
ここで項の数はm個としました。
m個のある関数たちを決めて、それに係数をかけて足し合わせたものが、近似関数となる、としたわけですね。
ここで、このm個の係数を求めるのがこれから行いたいことです。


次に想定しているもっともデータをあらわす近似曲線と測定データとがどのくらいズレているのかを求めます。
ここで、「もっともデータをあらわす近似曲線」というのは、測定したデータが本来とるべき値を与える曲線だと理解することができます。
つまり、
 本当はこの曲線上にyの値があるんだけど、誤差が入っちゃったから曲線からはずれちゃったよ
というわけです。
最小二乗法で近似曲線を求めることは、測定した現象の法則をもっともよく表す式を求めることとも言えるわけです。
なので、今後この求める近似曲線は本来のデータがとるべき値を表していて、実測データとの差は「誤差だ」としてしまいましょう。
そうすると、誤差は近似関数の値とデータの値yとの差なので、引き算をすればわかります。
 
ただ、単純に引き算しただけでは値がプラスにもマイナスにもなってしまうので都合が悪い。
なので二乗して正の値にしてしまいます。
 
それを全データ分足し合わせれば、求める近似曲線がどのくらいデータをよく近似しているかの目安になる式が得られます。
これを仮に「誤差関数」と名付けましょう。
誤差関数Jは以下になります。
 
ここで、測定したデータの個数はn個としました。
((x,y)の実測データの組がn個あるということですね)

このJですが、当然、近似関数がどんな関数かによって値が変わってきます。
ここで私たちがしたいのは、この誤差関数Jの値が一番小さい値になる近似関数を見つけ出したいわけです。


ここが重要なのですが。
この誤差関数Jはの各項の係数の多次元関数(m次元関数)と見ることができます。
なぜなら、使う関数たちを決めた時、この係数たちの値によって曲線が決まるからです。
また、各データの(x,y)を式に代入したとき、関数たちは計算されて、ただのある数値になってしまい、未定なのはこのたちだけになります。
つまり、この係数たちによって、近似関数は決定されるわけですね。
よって、誤差関数Jをの関数とみてその値を最小にするたちを見つければよいわけです。


を変数とみた場合、Jはその変数の二次方程式になっています。
そして、このグラフは下に凸のグラフです。
よって最小値は極小値と同じであることがわかります。
要は、グラフの底のとんがったところですね。
なので、それぞれのにて一回微分してやり、その値を0と置いてやれば、その式を満たすが誤差関数Jを最小にしますね。
(極小値では、グラフの傾きが0になる)
それぞれのにて偏微分を行いそれを0としたもの、合計m個の連立方程式を解くことになります。

以下、行ってみましょう。
まずは一つづつ。


Jとその中のf(x)を展開します。



合成関数の微分(外側微分して中を微分)


ここで、最後の偏微分は

だから、の項以外は0になって消えてしまうので、このを偏微分して
よって、




これが0と等しいので結局、





となります。

1≦k≦m なので、この式がm個出来るわけですね。
このm個の式に測定したn個のデータを代入して書き下し、出てくるm個の連立方程式を解いてやればいいわけです。

・・・しかしこれでは少々やりにくいですよね。
なので、行列表記にしてやりましょう。
行列にしてしまえば、多数の連立方程式を一気に解いてやることができます。

行列の掛け算を思い出してください。
たてよこの成分をそれぞれ掛けて足すのでした。
足すわけですから、行列の掛け算表記にすればΣの記号を消せますね。

上の式の一部を行列に書き換えます。




Σを行列の積にすることで消したわけです。
この式で行列の掛け算を行えば上の式と同じになるのがわかりますか?
いま紙と鉛筆がある人はちょちょっとやってみてくださいね。

もう一個Σがあります。
これも行列の掛け算にして消してしまいましょう。
ここで一つ。
足し算の各項は並べ替えても結果は同じになりますね。
なので足し算の順番を入れ替えてやります。
すると




となります。
この式の左辺を展開するとわかりますが、先ほどの式とは足し算の順番が変わってしまっています。
でもさっき述べた通り、足し算の順番を入れ替えても結果は同じなので問題ありません。

さて、kの範囲は 1≦k≦m なので、この式がm個あることになりますね。
(この式はあるひとつについて偏微分して0と置いた式でした)
これらも全部まとめると、結局以下になります。




ここで、



とおくと、上式は

 

となります。
ずいぶん式がすっきりしましたね!
なお、はそれぞれ


 



 

です。


これで連立方程式が解けます!
よく見るとすぐわかりますが、

はm×mの正方行列です。
ということは、これが正則であれば逆行列が存在します!
逆行列が存在するということは、それを両辺左から作用させてやれば、一発ですべての係数aが求まります!





以上が最小二乗法での近似関数の求め方です。

上に出てきたg(x)にはどんな関数を入れてもかまいません。
たとえば、



なんてしてもかまいません。
しかし、よりよい近似曲線を求めるには、それなりに近しくなると思われる関数を用いたほうがいいですね。

また、近似曲線が「連続関数でいたるところで滑らかである」と想定される場合、その近似曲線はテーラー展開できることになりますから、xのべき乗を関数にとるのがよい近似が得られると思います。
つまり、



という事ですね。


さて、最後にこのg(x)に関数を入れて計算の具体例を見てみましょう。
先ほどのテーラー展開可能な場合を想定して・・・という話の流れで、このxのべき乗を関数にとってみます。
おそらくレポートなどいろいろなところで一番活躍するかと思いますので。


ここで一つ注意。
データを扱う際、パソコンをみなさん用いるかと思います。
EXCELなどを駆使して計算を行う方が多いかと思います。
これらパソコンで数値を扱う場合、もっとも大きい数字を扱える変数の「型」は「Double」型です。
この型の変数を使用すれば、有効数字15ケタの数字まで扱う事ができます。
しかし、逆に有効数字が15ケタを超えてしまうと、計算結果はもう信用できなくなってしまいます。
パソコンを用いる時の制約として、数字の桁が15ケタを超えない範囲で数値を扱わなくてはいけないということです。

今回xのべき乗をg(x)にとりますが、xのべき乗数が大きくなればすぐに15ケタなどあふれてしまいます。
取得したデータの一番大きいx値をに代入した場合、どのべき乗数nまでは15ケタに収まるか考えてデータ処理をしなければなりません。
重要なポイントかつ注意が必要なので、みなさん気をつけてください。



今回はWebにもなかなか書かれていない三次関数の場合で計算を行ってみます。

今回、xの0乗(つまり切片)も考えたいので、kを0からスタートさせて、



とします。
つまり、kの範囲は 0≦k≦3 になります。
(気持ちの悪い人は、今までの導出時と同じくkを1からはじめて4まで増やしてもいいです。ただしその場合は、となります)

先ほど導き出した



にこれらを代入して、









ここで、



の逆行列が存在するとして、両辺の左からかけると、




となります。
ここで右辺の行列の中身やyの成分は全部ある「数字」になっているので、これを単純に数値計算してやれば欲しかった全部の係数aが求まります。

このあたりの数値計算は、EXCELなどの表計算ソフトにお任せしてやりましょう。
EXCELではこの逆行列の計算も行列の掛け算の計算も全部出来る関数が用意されてますので、この式さえ立ててやればすぐに答えを出してくれますよ。

あとは求まった各aを用いて、

 

としてやればいいわけですね。



如何だったでしょうか?
数式だらけで何がなんやらという方もいらっしゃるかもしれません。
でも実際にEXCELにデータを投入して式を書いていけば、なんとなく感覚は分かってくるかと思います。
ぜひ利用してみてください!
スポンサーサイト
別窓 | データ解析 | コメント:0 | トラックバック:0 | ∧top | under∨
<<関係代数 その14 INSERT文の話 | ITエンジニアの数学 | 関係代数 その13 UPDATE文の話 >>
コメント
コメントの投稿














管理者だけに閲覧

トラックバック
トラックバックURL

FC2ブログユーザー専用トラックバックURLはこちら


| ITエンジニアの数学 |
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。