In [38]:
import numpy as np
def rv(value_list):
return np.array([value_list])
def cv(value_list):
return np.transpose(rv(value_list))
def f(x):
return(x - 2.) * (x - 3.) * (x + 3.) * (x + 1.)
def fdf1(x):
return float((2 * x + 3)**2), 2 * 2 * (2 * x + 3)
def fdf2(v):
x = float(v[0]); y = float(v[1])
return f(x) + (x + y -1)**2,\
cv([(-3. + x) * (-2. + x) * (1. + x) + \
(-3. + x) * (-2. + x) * (3. + x) + \
(-3. + x) * (1. + x) * (3. + x) + \
(-2. + x) * (1. + x) * (3. + x) + \
2 * (-1. + x + y),
2 * (-1. + x + y)])
def one_hot(v, entries):
vec = len(entries)*[0]
vec[entries.index(v)] = 1
return vec
def num_grad(f, delta=0.001):
def new_func(x):
fu=np.zeros((len(x),len(x)))
for i in range(len(x)):
fu[i][i]=1
print(x+delta*np.reshape(fu[:,0],(-1,1)))
result=[(f(x+delta*np.reshape(fu[:,0],(-1,1)))-f(x-delta*np.reshape(fu[:,0],(-1,1))))/(2*delta) for i in range(len(x))]
return np.array([result])
return new_func
x=cv([0.1, -0.1])
ans=(num_grad(lambda xa: fdf2(xa)[0])(x).tolist(), x.tolist())
print(ans)
In [39]:
def minimize(f, x0, step_size_fn, max_iter):
fdf=lambda x: (f(x),num_grad(f)(x))
print(fdf(x0))
xn=gd(fdf, x0, step_size_fn, max_iter)
return xn
pass
In [40]:
ans=package_ans(minimize(f1, cv([0.]), lambda i: 0.1, 1000))
In [ ]: