为什么在numrical_gradient()函数的gradient[i] = (fh1 - fh2) / 2*h 语句里可以实现数值性的求偏导呢?原因是:
我们在每次的循环中,增加的是数组中的单个数值,比如第一次循环中增加的是X[0],第二次中增加的是X[1]
这样做,我们每次循环中就固定了另一个未知数,最后求解出来的结果在做减法的时候,
就会将另一个参数给”屏蔽掉”,从而得到偏导数
什么叫屏蔽掉呢?比如,第二个参数假设为4,在某一轮循环中我们都是在给另一个参数做增减操作,这个4没有发生变化,那么当我们在函数中对他做一个平方操作
计算fh1和fh2时,这个4的结果都是4*4 = 16,最后在对fh1和fh2做减法的时候,这个16在fh1和fh2中都有,做减法的时候就相当于这部分没有差别
看下面的计算,假设参数1是 3 ,参数2是4,h 是 0.001,在第一轮的循环中做了如下计算:
((3+0.001)^2 + 4^2) - ((3-0.001)^2 + 4^2) / 2*h
=((3+0.001)^2 + 16 - (3-0.001)^2 – 16) / 2*h (打开括号)
=((3+0.001)^2 - (3-0.001)^2 + 16 – 16) / 2*h (移项相减)
=((3+0.001)^2 - (3-0.001)^2) / 2*h
很明显了,结果里面的差别只出现在那个被做了 +h 和 -h 操作的参数上,所以,偏导数就这样求出来了