プロが教えるわが家の防犯対策術!

#include<stdio.h>
#define N 5
int main(){
double x[] = {1, 3, 4, 5.5, 7};
double y[] = {3, 5, 6, 8, 11};
double a = 0.028;
double eta = 0.001;
double dEda;
int ite, i
;
for (ite = 1; ite <= 1000; ++ite){
dEda = 0;
for(i = 0; i < N; i++){
dEda = dEda + (a * x[i] - y[i]) * x[i];
}
a =
if (ite == 1 || ite == 10 || ite == 100)
printf("%4d: a = %.8lf\n", ite, a);
}
printf("%4d: a = %.8lf\n", 1000, a);
return 0;
}

このプログラムの a = の部分にa-(dE/da)*((d^2)E/d(a^2))^-1を代入したいのですがうまくいきません。((d^2)E/d(a^2))の値を格納する変数を用意してちゃんと計算できるようにするにはどうすればよいでしょうか?
dE/da = Σ(ax-y)*x
(d^2)E/d(a^2) = Σx^2
という計算になります。

A 回答 (1件)

> dEda = 0;


のあたりに
ddEdada = 0;
> dEda = dEda + (a * x[i] - y[i]) * x[i];
のあたりに
ddEdada += x[i]^2;
としておいて
a -= dEda/ddEdada;
だな。

余計なお世話ながら、これは
 y[i]=ax[i]+ε[i]
というモデルを最小二乗法で(x,y)にフィッティングして(E=Σ(ε[i]^2)を最小にする)係数aを決める計算をニュートン法でやろうということですよね。
 しかしこの問題は線形最小二乗法ですから、1回だけaを計算すれば答に到達します。だから1000回繰り返すことには意味がありませんで、繰り返しの2回目以降は(浮動小数点数計算で生じる誤差を除いて)aは変化しません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング