Can someone explain me the bold part of this Python code? def f(x): return x**4
ID: 3874055 • Letter: C
Question
Can someone explain me the bold part of this Python code?
def f(x):
return x**4 + 4 * x**3 + x**2 - 10 * x + 1
def gradf(x):
return 4 * x**3 + 12 * x**2 + 2 * x - 10
def grad(f, x, delta=1e-5):
return (f(x + delta) - f(x - delta)) / (2 * delta)
def g(x):
return np.log(1 + np.exp(x))
def gradg(x):
return np.exp(x) / (1 + np.exp(x))
def h(x):
return g(f(x))
def gradh(x):
return gradg(f(x)) * gradf(x)
x = np.arange(-5.0, 3.0, 0.01)
y = h(x)
plt.clf()
plt.plot(x, y)
def grad_desc(f, x0, alpha, gradf=None, eps=1e-5, maxiters=100):
# initializaton, check arguments, ...
x = x0
y = f(x)
if gradf == None:
gradf = lambda x: grad(f, x)
xvals = [x]
yvals = [y]
for it in range(maxiters):
d = gradf(x)
new_x = x - d * alpha
print("it=", it, "x=", x, "new_x=", new_x, "d=", d)
if abs(d) < eps:
break
x = new_x
xvals.append(x)
yvals.append(f(x))
plt.plot(xvals, yvals, "o-")
return x
Explanation / Answer
This function is computing local minima of function x4 + 4x3+x2-10x+1 at the point x0 using gradient descent method and plot the curve at each iteration from 1 to 100, the value x and corresponding y=f(x) starting from the point x0 provided as input to the function upto the point when either iteration count reach upto 100, or the difference between previous and next iteration is less than "eps" provided to the function.
Below is the comments on various statements of the program:-
def grad_desc(f, x0, alpha, gradf=None, eps=1e-5, maxiters=100):
# initializaton, check arguments, ...
x = x0 #The point from where local minima has to be computed
y = f(x) #the value of y corresponding to x0
if gradf == None:
gradf = lambda x: grad(f, x) #call function grad(f, x), and compute gradient using central difference formula
xvals = [x] #xvals will contain the list of x co-ordinate of points, which will be added for plotting curve
yvals = [y] #yvals will contain the list of y co-ordinate of points, which will be added for plotting curve
for it in range(maxiters):
d = gradf(x) #d will store the derivative of function f at point x
new_x = x - d * alpha #new value of x computed for next iteration, using gradient descent updation rule
print("it=", it, "x=", x, "new_x=", new_x, "d=", d) #print the result of each iteration
if abs(d) < eps: #if the derivative value is less than eps, then stop further iteration
break
x = new_x
xvals.append(x) #appened new value of x into the list for printing in plot
yvals.append(f(x)) #appened new value of y into the list for printing in plot
plt.plot(xvals, yvals, "o-") #plot the curve
return x
Please comment for any clarification