読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

直線近似の分散を計算する

Robot

以下のような点群に対して,線形近似を行いたいとします.


(まさに,線形近似をおこなってくださいと言わんばかりのデータですね(笑))

自分ならこのような場合最小二乗法で近似します.

で,とりあえず近似直線が計算できたとしましょう.


では,その線形近似がどれだけうまくいっているかを知るにはどうすればいいのでしょうか?

自分は,統計学の専門家ではないので,よくわかりませんが,

以下の方法を行えば,近似直線に対して垂直方向のデータ点の分散が計算できるらしいです.

(つまり,近似直線に対して,垂直方向の誤差がどれだけ生じているのか?とも言えます.)

以下がこの方法をMATLABで試してみた時のプログラムです.


x=[0:0.1:10];
r=rand(1,length(x));

y=r+x;

e=[x;y];
c=cov(e');

[a,b]=eig(c);

sqrt(b(1,1))
sqrt(b(2,2))

plot(x,y,'.r');
grid on;
axis equal;


xとyがそれぞれのデータ点のx,y座標であるとします.

まず初めにx座標とy座標を一つの行列にまとめます.(行列e)

そして,この行列の共分散行列を計算します.

そして最後にこの行列の固有値を計算します.

計算された固有値の小さい方が,近似曲線の垂直方向に対する分散値になります.

(逆に,大きい方の固有値が近似曲線方向の分散値です)


正直,なぜこのような計算をすれば,それぞれの分散値が計算できるのかはわかりませんが,

このような方法でデータを分析する方法を主成分分析というらしいですね.

主成分分析を本気で勉強すれば,なぜこれで計算できるのかがわかるのかもしれません.


すべては自分の無知のせいですが,

こんな時は理系の伝家の宝刀を使いましょう.

自分は,この言葉に何度助けられたことでしょう.


「これは俺の専門じゃない」


(笑)