最小自乗法
回帰分析
説明変数と目的変数の関係のモデルを推
定する統計的手法
ある変量(説明変数)とその変量に対する望み
の結果(目的変数)の値がいくつか与えられる
説明変数が2つ以上ある場合には,重回
帰分析と言う
回帰分析
説明変数( x )と目的変数( y )の関係の実測値がいく
つか与えられたとする(下図)
x に対する y の予測値 y は,y = ax + b で与えられる
この直線の最適な係数 a, b を求めることによって,変
x y の関係が予測する
係数 a, b を回帰係数と呼ぶ
x
y
実測値
y=ax+b
^
最小自乗法
回帰係数を求める手法
実測値 yiと予測値 yi(=axi+b) の差(残差)の自乗
和を最小にするような回帰係数 a,b を求める
実測値のデータの個数:N
xii 番目の x の実測値 (i = 1・・・N)
yixiに対する y の実測値とする (i = 1・・・N)
a直線の傾き
b 切片
最小自乗法
1
2
3
4
5
110
150
120
130
5月の売上は?
売上
実測値
X
売上YY3X120
最小自乗法
X
Yy=a+bx+誤差
誤差の自乗和(図の正方形の和)を最小
にするようにして未知係数abを求める
ので最小自乗法と呼ぶ
最小自乗法
残差の自乗和: Q
Q = Σ(yi - yi)2
= Σ(yi- (axi+b))2(0)
i=1
N
i=1
N
最小自乗法
Qを最小とする a, b は, = 0 かつ = 0
を満たす
= -2Σxi(yi - (axi+b)) = 0 - (1)
= -2Σ(yi- (axi+b)) = 0 - (2)
(1)式を整理すると
Σxi(yi - (axi + b)) = 0
Σxiyi -Σ(axixi + bxi)) = 0
Σxiyi -aΣxixi = bΣxi - (3)
ρQ
ρa
ρQ
ρb
i=1
N
ρQ
ρa
ρQ
ρb i=1
N
i=1
N
i=1
N
i=1
Ni=1
N
i=1
N
i=1
N
最小自乗法
前ページ(2)式を整理すると
Σyi–Σaxi–Σb = 0
Σyi aΣxiNb = 0
Σyi aΣxi= Nb
b = 1/N (Σyi aΣxi)-(4)
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
(4)式を(3)式に代入して
以上のようにして,回帰係数を決定
この時のa,bが予測値と実測値の差の自乗を最小にするような,
予測値の式の係数
Σxiyi-aΣxixi= Σxi
i=1
NN
i=1 i=1
N
(Σyi-aΣxi)
i=1 i=1
N N
N
1
NΣxiyi-aNΣxixi = Σxi
i=1
N N
i=1 i=1
N
ΣxiΣyi-aΣxi
i=1 i=1
N N
i=1
N
a(ΣxiΣxi-NΣxixi) = ΣxiΣyi-NΣxiyi
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
i=1
N
ΣxiΣxi-NΣxixi
i=1
N
i=1
N
i=1
N
ΣxiΣyi-NΣxiyi
i=1
N
i=1
N
i=1
N
a = (5)
#include<stdio.h>
main()
{FILE *infile;
int i, n;
double a, b, x, y, x_sum, y_sum, xy_sum, xx_sum;
if ((infile=fopen("input.dat","r"))==NULL) {
printf("can't open file \n");
exit;
}
n=0;
xy_sum=0;
x_sum=0;
y_sum=0;
xx_sum=0;
while( fscanf(infile, "%lf%lf\n", &x, &y) != EOF ) {
xy_sum=xy_sum+x*y; /* x*y の和 */
x_sum=x_sum+x; /* x の和 */
y_sum=y_sum+y; /* y の和 */
xx_sum=xx_sum+x*x; /* x*x の和 */
n=n+1; /* データの数 n */
}
a=(x_sum*y_sum-n*xy_sum) / (x_sum*x_sum-n*xx_sum);
b=(y_sum-a*x_sum)/n;
printf("y = ax + b\n");
printf("a = %lf\nb = %lf\n", a, b);
fclose(infile);
}