梯度方向是偏导数最大的方向,方向导数和梯度
目录导数数值微分偏导数梯度
衍生物
函数在某一点的导数描述了该函数在该点附近的变化率:
例如,在一元函数中,点的p导数描述了该点切线的斜率:
数值分析求导:通过数学求导计算导数,例如:
Y=x2,那么y=2x
数值:微差求导。即根据导数定义公式,代入一个极小的x,求变化率。
Python示例:分别通过数值微分和解析求导计算f=x2在x=2处的导数:
#定义函数fdef f(x): return x*x#定义数值微分计算方法def numerical _ diff (f,x): h=1e-4 # 0.0001,x,注意不要太小,会造成舍入误差,变成0 return (f (x h)-f (x h))/(2 * h) #计算变化率x=2print(数值微分结果:{} 。format(numeric _ diff(f,x))) print(解析导数结果:{} .
在X不变的情况下(图中黑线),Z值只随Y值变化,变化率是函数对Y的偏导数(图中斜率)
计算偏导数时,将其他自变量视为常数。
举例:求y=x2 3xy2对x在点(1,2)的偏导数
解法:将y视为常数,根据导数公式:
y=2x 3y,
所以x在点(1,2)的偏导数为:21 32=8。
梯度对于有多个变量的函数,分别计算每个变量的偏导数。这些偏导数合并形成的向量叫做梯度。
对于上面的例子,在某一点,分别计算x和y的偏导数。这两个偏导数组成的向量就是梯度。梯度表示函数值变化速度最快的方向:
梯度计算的Python示例:
顺序:y=x02 x12
导入numpy为np#定义函数,主x为二维数组def f(x): return x[0]**2 x[1]**2#通过数值微分计算梯度,注意x为数组def numerical _ gradient (f,x): h=1e-4 # 0.0001,x注意不要太小,会造成舍入误差,变成0 grad=NP。zeros _ like(x)for index in range(x . size):#计算偏导数temp _ val=x[index]x[index]=temp _ val h FX h1=f(x)x[index]=temp _ val-h FX H2=f(x)#将偏导数保存为梯度向量grad[index]=(FX h1-FX H2)/(2 * h)x[index]=temp _ val return grad #计算梯度打印(numerical _ gradient (f,np.array ([3 4.0])
[6.8.]
[0.4.]
#对渐变的直观理解
在上面的例子中,y=x02 x12,由python绘制如下:
我们计算区间[-2,2]中每一点的x0和x1的“负梯度”,并用python绘制:
大家可以看到,每个点的梯度都指向(0,0)点,这是使函数值最小(函数值为0)的点,离这个点越远,梯度越大,也就意味着函数值下降越快。这个特性在机器学习中起着非常重要的作用!