In [3]:
% matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
In [47]:
# p: 初期位置
p = 8.5
# r: 学習率
r = 1
# e: 許容誤差
e = 0.02
def f_cost(w):
"""
コスト関数
w: 入力値
"""
# y = x * x
# cost = np.power(w, 2)
# converged sin
cost = np.sin(w) * np.exp(-0.05 * w)
return cost
def differential(w):
"""
コスト関数の結果(微分)を返す
w: 入力値
"""
# y = x * x
# ret = 2 * w
# converged sin
ret = (-0.05 * np.exp(-0.05 * w) * np.sin(w)) + (np.exp(-0.05 * w) * np.cos(w))
return ret
def tangent(c_f, d_f, w, x):
"""
接線の方程式にxの値をかける
c_f: 高階関数(コスト関数)
d_f: 高階関数(コスト関数の微分)
w: 接線のx座標値
x: 接線の端のx座標
"""
return d_f(w) * (x - w) + c_f(w)
def output(c_f, d_f, t_f, p, r, e, loop_max = 10000):
"""
グラフ出力
c_f: 高階関数(コスト関数)
d_f: 高階関数(コスト関数の微分)
p: 初期位置
r: 学習率
e: 許容誤差
loop_max: 最大ループ回数
"""
x = np.linspace(0, 20, 100)
y = c_f(x)
x_p = np.array([])
y_p = np.array([])
t_p = []
i = 1
while True:
w = np.abs(d_f(p))
if w < e:
break
else:
p = p - r * d_f(p)
x_p = np.append(x_p, p)
y_p = np.append(y_p, c_f(p))
plt.plot([p - 1, p + 1], [t_f(c_f, d_f, p, p - 1), t_f(c_f, d_f, p, p + 1)], 'r-')
i = i + 1
if i > loop_max:
break
plt.plot(x, y, 'r-', x_p, y_p, 'bo-')
plt.show()
output(f_cost, differential, tangent, p, r, e)
In [ ]: