2021/04/08
身長(x1) | 腹囲(x2) | 体重(y) |
172.5 | 80.3 | 70.2 |
171 | 74.2 | 62.1 |
165.5 | 74.2 | 58.1 |
169.9 | 75.6 | 60.4 |
170.2 | 78.2 | 64.1 |
D = np.array(((172.5,80.3,70.2),(171,74.2,62.1),(165.5,74.2,58.1),(169.9,75.6,60.4),(170.2,78.2,64.1)))
d_avg = np.average(D, axis=0)
x = D - d_avg
yp = x1 * w1 + x2 * w2
def lose_score(X, w):
l = X[:,0] * w[0] + X[:,1] * w[1] - X[:,2]
lose = np.sum(l**2)
return lose
l = X[:,0] * w[0] + X[:,1] * w[1] - X[:,2]
yd = yp - yt = x1 * w1 + x2 * w2 - yt
def grad(X, w):
x = X[:,0]
y = X[:,1]
z = X[:,2]
g1 = 2 * x * (x * w[0] + y * w[1] -z)
grad1 = np.sum(g1)
g2 = 2 * y * (y * w[1] + x * w[0] -z)
grad2 = np.sum(g2)
grad = np.array((grad1, grad2))
return grad
g1 = 2 * x * (x * w[0] + y * w[1] -z)
d(l**2) / d(w1) = d((x * w1 + y * w2 - z)**2) / d(w1)
d(l**2) / d(w1) = d(x**2 * w1**2 + y**2 * w2**2 + z**2 + 2 * x * y * w1 * w2 - 2 * y * z * w2 - 2 * z * x * w1) / d(w1)
d(l**2) / d(w1) = x**2 * 2 * w1 + 2 * x * y * w2 - 2 * z * x = 2 * x * (x * w1 + y * w2 - z)
g2 = 2 * y * (y * w[1] + x * w[0] -z)
d(l**2) / d(w2) = d((x * w1 + y * w2 - z)**2) / d(w2)
d(l**2) / d(w2) = d(x**2 * w1**2 + y**2 * w2**2 + z**2 + 2 * x * y * w1 * w2 - 2 * y * z * w2 - 2 * z * x * w1) / d(w2)
d(l**2) / d(w2) = y**2 * 2 * w2 + 2 * x * y * w1 - 2 * y * z = 2 * y * (y * w2 + x * w1 - z)
def train(X, l_rate=0.00003, max_run=50):
w = np.ones(2)
for _ in range(max_run):
g = grad(X, w)
if np.linalg.norm(g) == 0:
break
else:
w -= l_rate * g
return w
yp = x1 * w1 + x2 * w2 = x @ w
yd = yp - yt
d(g・f(w)) / dw = g(x)' * d(f(w)) / dw
d(f(w)) / d(w1) = d(yd) / d(w1)
d(f(w)) / d(w1) = d(yp - yt) / d(w1)
d(f(w)) / d(w1) = d(x1 * w1 + x2 * w2 - yt) / d(w1) = x1
g(yd)' = (yd**2)' = 2 * yd
d(l**2) / d(w1) = d(yd**2) = (yd**2)' * d(yd) / d(w1) = 2 * yd * x1
d(f(w)) / d(w2) = d(yd) / d(w2)
d(f(w)) / d(w2) = d(yp - yt) / d(w2)
d(f(w)) / d(w2) = d(pred(X, w) - yt) / d(w2)
d(f(w)) / d(w2) = d(x1 * w1 + x2 * w2 - yt) / d(w2) = x2
g(w)' = (yd**2)' = 2 * yd
d(l**2) / d(w2) = d(yd**2) = (yd**2)' * d(yd) / d(w2) = 2 * yd * x2
grad(m) = 2 * yd(m) * x(m)
grad(m) = yd(m) * x(m) / M
yd * x = yd[0] * x[0] + yd[1] * x[1] + … + yd[4] * x[4]
yd * x = (yd[0] * x1[0] + yd[1] * x1[1] + … + yd[4] * x1[4], yd[0] * x2[0] + yd[1] * x2[1] + … + yd[4] * x2[4])
grad = x.T @ yd / M
lose = np.sum(yd**2) / 2 * M = (np.sum(yd**2) / M) / 2 = np.mean(yd**2) / 2
yp = w1 * x + w2 = w1 * x + w2 * 1
yp = w @ x
d = np.array(((172.5,80.3,1,70.2),(171,74.2,1,62.1),(165.5,74.2,1,58.1),(169.9,75.6,1,60.4),(170.2,78.2,1,64.1)))
x = d[:,:-1]
yt = d[:,-1]
import numpy as np
d = np.array(((172.5,80.3,1,70.2),(171,74.2,1,62.1),(165.5,74.2,1,58.1),(169.9,75.6,1,60.4),(170.2,78.2,1,64.1)))
x = d[:,:-1]
yt = d[:,-1]
# データ数
M = x.shape[0]
# データ次元数
D = x.shape[1]
w = np.ones(D)
l_rate = 0.01
max_run = 50
loss = 0
for _ in range(max_run):
yp = x @ w
yd = yp - yt
w -= l_rate * x.T @ yd / M
loss = np.mean(yd**2) / 2
print(w)
print(loss)