读书笔记:求函数梯度的Python代码 numerical_gradient.py ← 斋藤康毅
由多元函数全部变量的偏导数汇总而成的向量称为梯度(gradient)。
梯度指示的方向是各点处的函数值减小最多的方向。
下文给出了求函数 的梯度的 Python 代码。
【求函数梯度的Python代码】
import numpy as np
import matplotlib.pylab as plt
def numerical_gradient_no_batch(f,x):
h=1e-4
grad=np.zeros_like(x)
for idx in range(x.size):
tmp_val=x[idx]
x[idx]=float(tmp_val)+h
fxh1=f(x)
x[idx]=tmp_val-h
fxh2=f(x)
grad[idx]=(fxh1-fxh2)/(2*h)
x[idx]=tmp_val
return grad
def numerical_gradient(f,X):
if X.ndim==1:
return numerical_gradient_no_batch(f,X)
else:
grad=np.zeros_like(X)
for idx,x in enumerate(X):
grad[idx]=numerical_gradient_no_batch(f,x)
return grad
def fun_2(x):
if x.ndim==1:
return np.sum(x**2)
else:
return np.sum(x**2,axis=1)
def tangent_line(f,x):
k=numerical_gradient(f,x)
b=f(x)-k*x
return lambda t:k*t+b
if __name__=='__main__':
x0=np.arange(-2,2.5,0.25)
x1=np.arange(-2,2.5,0.25)
X,Y=np.meshgrid(x0,x1)
X=X.flatten()
Y=Y.flatten()
grad=numerical_gradient(fun_2,np.array([X,Y]))
plt.figure()
plt.quiver(X,Y,-grad[0],-grad[1],angles="xy",color="g")
plt.xlim([-2,2])
plt.ylim([-2,2])
plt.xlabel('x0')
plt.ylabel('x1')
plt.grid()
plt.draw()
plt.show()
【程序运行结果】
下图中的箭头绘制主要用到了 plt.quiver 函数。
【参考文献】
https://www.cnblogs.com/gujianmu/p/12853643.html
Advanced quiver and quiverkey functions — Matplotlib 3.3.3 documentation
matplotlib.axes.Axes.quiverkey — Matplotlib 3.3.3 documentation