情報工学実験 I データ解析・直線によるデータの当てはめ(宮里) 学籍番号:065762A 氏名:与儀涼子 作成:19.07.13 提出:19.07.13 1 補足プログラムの動作 1 3つの補足プログラムの動作を確認せよ。 まず、プログラムの未完成の部分をコメントアウトしてコンパイルし、動作を確認した。 実行結果 ----------------------------% ./lsf-demo Curve fit data is created using the quadratic y(x) = c(1) + c(2)*x + c(3)*x^2 Enter the coefficients: c(1) = 1 c(2) = 2 c(3) = 3 Enter estimated error bar: 100 Fit parameters: a(1) = 0 +/- 0 a(2) = 0 +/- 0 Chi square = 0; N-M = 48 ----------------------------コンパイルに成功し、プログラムを実行することもできた。しかしまだ部分的に未完成であるた め、データを入力しても結果として 0 が出力される。 線形回帰,最小二乗法について調べて簡潔にまとめよ。 2 2.1 線形回帰について 線形回帰とは、与えられた二次元のデータを一次関数で近似することである。全てのパラメータか ら最も近い直線を選ぶための手法の代表として、以下の最小二乗法がある。 2.2 最小二乗法について データを近似する手段の一つ。二次元データを一次関数で表す場合、推定値の直線と全てのデータ との差分の二乗平均を求め、その値が最小になる直線が最も近似な直線である。 3 カイ二乗関数について調べて簡潔にまとめよ データを最小二乗法を使って近似する場合、誤差範囲の大きい点ほど加重が減るような基準を用 いるとよい。つまり、推定値の直線から近い点が 1 ずれることは大きな差だが、推定値の直線から十 分遠い点が 1 ずれることの影響は小さい。 2 この基準を実現するために、推定値と実際のパラメータの差の二乗を、距離から求めた値で割ること にする。この当てはめに使われるのがカイ二乗関数で、以下のように定義される。 χ ({aj }) = 2 )2 N ( ∑ ∆i i=1 σi = N ∑ [Y (xi ; {aj }) − yi ]2 i=1 σi2 線形回帰当てはめプログラム 4 線形回帰当てはめプログラム (lin-reg.cpp) を完成させよ. 以下に lin reg.cpp のソースコードを示す。 // 線形回帰プログラム // Inputs // x 独立変数 従属変数 // y // sigma // Outputs y における推定誤差 // // a_fit sig_a a(1):切片, a(2):傾き パラメータ a() における推定誤差 // // yy chisqr 推定値 カイ二乗関数 #include "NumMeth.h" #include "math.h" void lin_reg(Matrix x, Matrix y, Matrix sigma, Matrix &a_fit, Matrix &sig_a, Matrix &yy, double &chisqr) { //* Evaluate various sigma sums int i, nData = x.nRow(); double sigmaTerm; double s = 0.0, sx = 0.0, sy = 0.0, sxy = 0.0, sxx = 0.0; for( i=1; i<=nData; i++ ) { // 式 (5.10) の計算を行う sigmaTerm = 1/(sigma(i)*sigma(i)); s += sigmaTerm; sx += x(i)*sigmaTerm; sy += y(i)*sigmaTerm; sxy += (x(i)*y(i))*sigmaTerm; sxx += (x(i)*x(i))*sigmaTerm; } 3 //* 切片 a_fit(1) と 傾き a_fit(2) の計算 // ここに式 (5.11) に対応する部分を書く //a_fit(1) = ・ ・ ・ ・ a_fit(1) = ((sy*sxx) - (sx*sxy)) / ((s*sxx) - (sx*sx)); a_fit(2) = ((s*sxy) - (sy*sx)) / ((s*sxx) - (sx*sx)); //* 切片と傾きの誤差範囲を計算 //sig_a(1) = ・ ・ ・ ・ sig_a(1) = sqrt(sxx / (s*sxx-(sx*sx))); sig_a(2) = sqrt(s / (s*sxx-(sx*sx))); //* 推定値とカイ二乗関数の計算 chisqr = 0.0; // ここに書く for(i=1;i<=nData;i++){ chisqr += sigmaTerm * (a_fit(1) + (a_fit(2) * x(i)) - y(i))\\ * (a_fit(1) + (a_fit(2) * x(i)) - y(i)); yy(i) = a_fit(1) + (a_fit(2) * x(i)); } } 4 5 octave を用いた結果のグラフ octave を用いて結果をプロットし考察せよ.なお 3 種類のデータを発生 させ,それぞれグラフ化 する事. ----------------------------% ./lsf-demo Curve fit data is created using the quadratic y(x) = c(1) + c(2)*x + c(3)*x^2 Enter the coefficients: c(1) = 1 c(2) = 1 c(3) = 1 Enter estimated error bar: 1 Fit parameters: a(1) = -441.301 +/- 0.287139 a(2) = 52.0032 +/- 0.00979992 Chi square = 1.73594e+06; N-M = 48 ----------------------------- 緑色の直線が yy.txt、赤色の点で示されているのが y.txt である。赤色の点は、結ぶと二次曲線に なるような分布である。 5 ----------------------------% ./lsf-demo Curve fit data is created using the quadratic y(x) = c(1) + c(2)*x + c(3)*x^2 Enter the coefficients: c(1) = 1 c(2) = 2 c(3) = 3 Enter estimated error bar: 300 Fit parameters: a(1) = -1415.21 +/- 86.1418 a(2) = 155.948 +/- 2.93998 Chi square = 253.124; N-M = 48 ----------------------------- error bar(誤差の範囲) を大きくしてみた。今度は赤色の点の分布が二次曲線からかなりばらつい たのがわかる。 6 ----------------------------% ./lsf-demo Curve fit data is created using the quadratic y(x) = c(1) + c(2)*x + c(3)*x^2 Enter the coefficients: c(1) = 1 c(2) = 2 c(3) = -3 Enter estimated error bar: 100 Fit parameters: a(1) = 1296.93 +/- 28.7139 a(2) = -150.684 +/- 0.979992 Chi square = 1509.24; N-M = 48 ----------------------------- c(3) の値をマイナスにしてみた。上に凸の二次関数の点がばらけたような分布になる。 参考文献 [1] wikipedia http://ja.wikipedia.org/ [2] 授業配布のプリント 7
© Copyright 2024 ExpyDoc