問題設定

データx, yについて、以下のものを求めよ。

  1. 平均
  2. 分散
  3. 共分散
  4. 回帰式y=ax+bのa, b
In [109]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
In [110]:
x = np.array([2, 3, 4, 5, 6])
y = np.array([-6, -5, -4, -3, -1])

解答

平均

In [112]:
ave_x = sum(x)/len(x)
ave_y = sum(y)/len(y)
ave_x, ave_y
Out[112]:
(4.0, -3.7999999999999998)

分散

In [113]:
dis_x = sum([(xx - ave_x)**2 for xx in x])/len(x)
dis_y = sum([(yy - ave_y)**2 for yy in y])/len(y)
dis_x, dis_y
Out[113]:
(2.0, 2.96)

共分散

In [114]:
dis_xy = sum([(x[i]-ave_x)*(y[i]-ave_y) for i in range(len(x))])/len(x)
dis_xy
Out[114]:
2.3999999999999999

回帰式y=ax+bのパラメータ

http://mathtrain.jp/leastsquares を参考に...

In [115]:
a = dis_xy/dis_x
b = ave_y - a*ave_x
a, b
Out[115]:
(1.2, -8.5999999999999996)

図にしてみる

In [120]:
f = lambda x: a*x + b
input = np.linspace(0, 10, 1000)
output = [f(xx) for xx in input]
plt.plot(input, output)
plt.scatter(x, y, color="red")
plt.show()

うまく共分散、分散、平均を用いて最小二乗法による一次近似ができた。