組込み系プログラマの終末

プログラミング、デバイスドライバ、資格、試験、等などなど

最小二乗法で近似直線を求める

とあるウェアラブルバイス開発時にセンサの測定値に誤差が乗ってしまう問題がありました。色々調べているとその誤差は「人の歩く速度」によって大きさが変わることが分かったので、歩く速度を変えて誤差の大きさを測定しました。その結果が下のグラフです。(縦軸:誤差量、横軸:速度)

f:id:public2015:20160630222637p:plain

 

 

性別や体重、年齢の違う人たちに同じように歩いてもらいました。その結果誤差は「性別や体重、年齢には依存せず、速度にほぼ比例する」という特性を掴みました。つまり以下のように誤差を直線として表すことができます。

f:id:public2015:20160630222643p:plain

この直線の方程式(Y(誤差量)=αxX(速度)+β)を見つけることで誤差量を算出できるようになるため、下記式で誤差を取り除いた真の値(に近い値)を知れるようになります。

真値=測定値ー(α✕速度+β)

さて、ではこのαとβはどう求めるのでしょうか?今日はその方法をできるだけ分かりやすく説明したいと思います。

 

連立方程式

まずは単純に2点を選んで直線の方程式を求めてみるとどうなるか考えてみましょう。

 

f:id:public2015:20160630225201p:plain

多くのデータの振る舞いとよく似た直線を求めたいので、上図の【期待する直線】が求めたい近似直線となります。

さて連立方程式の場合、選んだ2点によって赤破線や青破線のように期待しない直線となってしまうことがあります。よって連立方程式で近似直線を求めるのは不適切となります。

 

最小二乗法で求める

今回の目的は、人の歩く速度によって乗る誤差がどの程度か推測するために、誤差を式で表すことです。そのために(Y(誤差量)=αxX(速度)+β)におけるαとβを見つける必要があります。このようなケースではデータの近傍を繋ぐ補間方法である最小二乗法が有効です。

 

図中の4点をそれぞれ以下のようにx1〜x4とy1〜y4で表します。

(X1,Y1)

(X2,Y2)

(X3,Y3)

(X4,Y4)

 

さてではY(誤差量)=αX(速度)+βにx1〜x4とy1〜y4を代入してみましょう。

Y1=αX1+β

Y2=αX2+β

Y3=αX3+β

Y4=αX4+β

 

上記4つの関係を満たすαとβは・・・4点が厳密に同一直線上にいない限り、残念ながら存在しません。あれ、このままではαとβは解が無いとなってしまいます。それは困る。そこで新たに真値との「誤差」を用意しましょう。

f:id:public2015:20160630231204p:plain

先ほどの式を書きなおすと下記になります。ε(イプシロン)が真値との誤差を表しています。

Y1=αX1+β+ε1・・・①

Y2=αX2+β+ε2・・・②

Y3=αX3+β+ε3・・・③

Y4=αX4+β+ε4・・・④

 

ε1〜ε4が最小になるαとβを見つけることで、良い近似直線を見つけることができます。

 

特定のεではなく、εの合計が最小となるものを見つけなければなりません。しかしεは正負どちらもありえるため単純に加算すると誤った結果を得てしまうことがあります。

4つの誤差が 1、−1、2、2 の場合、和は0

4つの誤差が 0.1、0.2、0.1、0.3の場合和は0.7 どっちが誤差が小さいか?

 このような場合は全て二乗することで正のみとし、その後加算します。

誤差の大きさ指標=(ε1)^2+(ε2)^2+(ε3)^2+(ε4)^2

 

さてでは誤差の大きさ指標に先ほどの式①〜④を代入してみましょう。

誤差の大きさ指標

 =(Y1ー(αX1+β))^2

  +(Y2ー(αX2+β))^2

  +(Y3ー(αX3+β))^2

  +(Y4ー(αX4+β))^2

 

シグマ∑を使って整理すると⇓になります。

誤差の大きさ指標 ∑(ε^2) =∑(Yi − (αXi +β))^2

 

∑(Yi − (αXi +β))^2を後々のために展開するておきます。

∑( Yi^2 −2Yi(αXi +β)+(αXi +β)^2)

=∑( Yi^2 −2Yi(αXi +β)+(αXi)^2 +2αβXi + β^2)・・・⑤

 

誤差を最小にするためには式⑤の値が最小になればいいわけですね。

 

突然ですが、∑(ε^2) ≧0なので当然式⑤も0以上となります。これを利用して式⑤を最小とするα、βを求めることができるのです。

 

さて式⑤ ∑( Yi^2 −2Yi(αXi +β)+(αXi)^2 +2αβXi + β^2) は複雑に見えますね。でも求めたいα、βに着目すると、式⑤はα^2とβ^2を含んだ2次関数としてみることができます。常に0以上の2次関数ということはつまり下図のような「下に凸」として考えることができます。

f:id:public2015:20160630235513p:plain

2次関数における最小値を求める方法は微分が一般的です。微分によって接線の傾きを求め、傾き=0の点が最小となります。

 

式⑤は変数としてα、βの2つを持っています。このような関数の微分偏微分という大学で習う微分を用いる必要があります。偏微分?!まぁ身構えず気楽に行きましょう。

 

偏微分を簡単に言うと、

式⑤をαで偏微分するということは、α以外を定数として普通に微分すること。

式⑤をβで偏微分するということは、β以外を定数として普通に微分すること。

です。

 

さっそくやってみます。

∑( Yi^2 −2Yi(αXi +β)+(αXi)^2 +2αβXi + β^2)をαで偏微分すると

=∑( −2YiXi+2α(Xi)^2 +2βXi )

=−2∑( XiYi − αXi^2  − βXi )

 

これが0のとき誤差の大きさ指標 ∑(ε^2)は最小なので

−2∑( XiYi − αXi^2  − βXi )=0

∑( XiYi − αXi^2  − βXi )=0

α∑Xi^2  =∑( XiYi  − βXi )

α=∑( XiYi  − βXi ) / (∑Xi^2)・・・★1

 

 続いて

∑( Yi^2 −2Yi(αXi +β)+(αXi)^2 +2αβXi + β^2)をβで偏微分すると

=∑( −2Yi + 2αXi +2β )

=−2∑( Yi − αXi  − β )

 

同様にこれが0のとき誤差の大きさ指標 ∑(ε^2)は最小なので

∑( Yi − αXi  − β )=0

α∑Xi  =∑( Yi   − β )

α=∑( Yi   − β ) / ∑Xi  ・・・★2

 

うん。なんとか★1と★2を求められました。この2つを頑張ってα、βについて解くと、最小二乗法 - Wikipediaの下記公式を導出できます。

 

f:id:public2015:20160701002205p:plain

 上記式に、(X1,Y1)(X2,Y2)(X3,Y3)(X4,Y4)を代入し、

∑( XiYi)=X1Y1 + X2Y2 + X3Y3 + X4Y4

といった具合で一個づつ計算することでαとβを求めることができます。

切片0の近似直線がいい場合

さて頑張ってαとβを求めたわけですが、下の図なにか変です。

f:id:public2015:20160630222643p:plain

誤差量は人の歩く速度に比例して大きくなり、停止している場合(速度=0)は理論的には誤差量も0になるはずなんです。

 

このようにX=0のときYも0になるようなデータの場合、β=0、つまり切片0として近似直線を求めたいことがあるのです。

f:id:public2015:20160630222647p:plain

この場合は式★1(α=∑( XiYi  − βXi ) / (∑Xi^2))のβに0を代入し

α=∑( XiYi )  / (∑Xi^2)

でαを求めることができます。

まとめ

みなさんご存知のように、近似直線はエクセルの機能で求められます。なので中々理論に立ち返る機会は少なく、私はすぐ忘れてしまいます・・・。理解の助けになれば幸いです。