最小二乗法
i.e. linear curve fitting
直線だけど
数式
傾き A
$ = \frac{\mathrm{Cov}[X,Y]}{\mathrm{Var}[X]}
$ = \frac{ E[(X - E[X])(Y - E[Y])] }{ E[(X - E[X])^2] }
切片 B
$ = E[Y] - A\,E[X]
性質
得られた直線は必ず$ (μ_X,μ_Y)を通る。
$ ∵ μ_Y = B + A\,μ_X
Aは X と Y の平行移動に対して不変 (i.e. shift-invariant)
Var も Cov も不変なので
algorithm
でもオンライン処理で正確度を たもてるのか?
精度を気にするなら、データ点ごとに移動平均を引く方が良い。桁落ちもしない。 $ M = \frac{ Σ_i(x - \bar{x})(y - \bar{y}) }{ Σ_i(x - \bar{x})^2 } = \frac{ Σ_i(y - \bar{y}) }{ Σ_i(x - \bar{x}) }
wint.icon この変形は合法か?
下のアルゴリズムを見る限りは大丈夫そう。
Welford's online algorithm を利用する。
code:online
let n := data.len();
let mut mx = my = v = c = m = b := 0;
for (x,y) in data {
let dx = x-mx;
mx += dx/n;
let dy = y-my;
my += dy/n;
v += (x-mx)*dx;
c += (x-mx)*dy;
// simply?
m += dy/dx;
}
m := c/v;
b := my - m*mx;
Cov と Var とで相殺するので、不偏か どうかは 気にしなくて良い。
ref.