%matplotlib inline
import matplotlib.pyplot as plt
data_X = [4,8,13,17]
data_Y = [7,10,11,14]
x_min, x_max = min(data_X) - 1, max(data_X) + 1
y_min, y_max = min(data_Y) - 1, max(data_Y) + 1
plt.figure(2, figsize=(8, 6))
plt.clf()
plt.scatter(data_X, data_Y, c=data_Y, cmap=plt.cm.Paired)
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()
$E = (4a+b-7)^2+(8a+b-10)^2+(13a+b-11)^2+(17a+b-14)^2 \geq 0 $
$E = |4a+b-7|+|8a+b-10|+|13a+b-11|+|17a+b-14|$
特に「最小二乗法」でデータ点から直線を推定する場合,次の3つのことを仮定しています.
基底関数
(関数を表現するベースとして使うもの)%matplotlib inline
import matplotlib.pyplot as plt
data_X = [0.0,2.0,3.9,4.0]
data_Y = [4.0,0.0,3.0,2.0]
x_min, x_max = min(data_X) - 1, max(data_X) + 1
y_min, y_max = min(data_Y) - 1, max(data_Y) + 1
plt.figure(2, figsize=(8, 6))
plt.clf()
plt.scatter(data_X, data_Y, c=data_Y, cmap=plt.cm.Paired)
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()
$$ f(x) = \phi_0 + \phi_1 x + \phi_2 x^2$$
誤差関数の偏微分は $\omega_0 〜\omega_3$のそれぞれを行うため,4次元の連立方程式が得られます.
import numpy as np
a=np.array([[4,9.9,35.21,131.319],
[9.9,35.21,131.319,503.3441],
[35.21,131.319,503.3441,1958.242],
[131.319,503.3441,1958.242,7678.7438]
]
)
a
array([[ 4.00000000e+00, 9.90000000e+00, 3.52100000e+01, 1.31319000e+02], [ 9.90000000e+00, 3.52100000e+01, 1.31319000e+02, 5.03344100e+02], [ 3.52100000e+01, 1.31319000e+02, 5.03344100e+02, 1.95824200e+03], [ 1.31319000e+02, 5.03344100e+02, 1.95824200e+03, 7.67874380e+03]])
inv_a = np.linalg.inv(a)
Y=np.array([9,19.7,77.63,305.957])
omega=np.linalg.solve(a,Y)
omega
array([ 4.00000669, -16.91817451, 10.8136275 , -1.67727384])
$f(x) = 4.00 - 16.91x + 10.81x^2 -1.68x^3$
%matplotlib inline
import matplotlib.pyplot as plt
data_X = [0.0,2.0,3.9,4.0]
data_Y = [4.0,0.0,3.0,2.0]
x_min, x_max = min(data_X) - 1, max(data_X) + 1
y_min, y_max = min(data_Y) - 1, max(data_Y) + 1
plt.figure(2, figsize=(8, 6))
plt.clf()
plt.scatter(data_X, data_Y, c=data_Y, cmap=plt.cm.Paired,color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
X = np.linspace(x_min, x_max, 256)
Y = omega[0]+omega[1]*X+omega[2]*X*X + omega[3]*X*X*X
plt.plot(X,Y,color='blue', linewidth=3)
plt.show()
import numpy as np
a=np.array([[4.1,9.9,35.21,131.319],
[9.9,35.31,131.319,503.3441],
[35.21,131.319,503.3441,1958.242],
[131.319,503.3441,1958.242,7678.7438]
]
)
a
array([[ 4.10000000e+00, 9.90000000e+00, 3.52100000e+01, 1.31319000e+02], [ 9.90000000e+00, 3.53100000e+01, 1.31319000e+02, 5.03344100e+02], [ 3.52100000e+01, 1.31319000e+02, 5.03344100e+02, 1.95824200e+03], [ 1.31319000e+02, 5.03344100e+02, 1.95824200e+03, 7.67874380e+03]])
Y=np.array([9,19.7,77.63,305.957])
omega_reg=np.linalg.solve(a,Y)
omega_reg
array([ 3.56959491, -0.72976849, -1.10894418, 0.30943956])
omega
array([ 4.00000669, -16.91817451, 10.8136275 , -1.67727384])
%matplotlib inline
import matplotlib.pyplot as plt
data_X = [0.0,2.0,3.9,4.0]
data_Y = [4.0,0.0,3.0,2.0]
x_min, x_max = min(data_X) - 1, max(data_X) + 1
y_min, y_max = min(data_Y) - 1, max(data_Y) + 1
plt.figure(2, figsize=(8, 6))
plt.clf()
plt.scatter(data_X, data_Y, c=data_Y, cmap=plt.cm.Paired,color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
X = np.linspace(x_min, x_max, 256)
Y = omega_reg[0]+omega_reg[1]*X+omega_reg[2]*X*X + omega_reg[3]*X*X*X
plt.plot(X,Y,color='blue', linewidth=3)
plt.show()