[kaze's test] プログラミングメモ →目次

最小二乗法(アルゴリズム)

Least squares method



定義:
① 複数の点の実験データ(xi, yi))から、近似曲線を求めます。

② 近似曲線は、複数の係数akと関数gkの積和f(x)とします。

③ 各実験データのyiと各実験データのxiの関数f(xi)の誤差の二乗和をJとします。

④ Jのそれぞれの係数akで偏微分した値がゼロになる時に、誤差が一番小さいと考えます。

⑤ 例として、直線の場合を計算します。

⑥ a係数の偏微分した値=0から、aを求めます。

⑦ b係数の偏微分した値=0から、bを求めます。

例:

#define NN 20
double test_data[NN][2] =
{
	{-0.100, 2.200},
	{1.250, 2.550},
	{2.050, 2.800},
	{2.850, 3.350},
	{4.050, 4.150},
	{5.000, 4.500},
	{5.900, 5.200},
	{7.200, 5.700},
	{8.150, 6.000},
	{8.950, 6.400},
	{10.050, 7.200},
	{11.100, 7.650},
	{12.150, 8.150},
	{12.950, 8.700},
	{14.000, 8.850},
	{14.950, 9.400},
	{15.850, 10.200},
	{17.150, 10.300},
	{17.800, 10.900},
	{19.050, 11.500}
};
double a;
double b;
void least_squares_method_test()
{

	int k;
	double sum_xk_yk = 0;
	double sum_xk = 0;
	double sum_yk = 0;
	double sum_xk_xk = 0;
	for (k = 0; k < NN; k ++)
	{
		sum_xk_yk += test_data[k][0] * test_data[k][1];
		sum_xk += test_data[k][0];
		sum_yk += test_data[k][1];
		sum_xk_xk += test_data[k][0] * test_data[k][0];
	}
	a = (NN * sum_xk_yk - sum_xk * sum_yk)
		/
		(NN * sum_xk_xk - sum_xk * sum_xk);

	b = (sum_xk_xk * sum_yk - sum_xk_yk * sum_xk)
		/
		(NN * sum_xk_xk - sum_xk * sum_xk);

}
結果:
a = 0.49738, b = 2.05120。 y = 0.49738x + 2.05120