热线电话:13121318867

登录
2018-11-28 阅读量: 972
估算梯度

如果 f 是单变量函数,那么它在 x 点的导数衡量了当 x 发生变化时, f(x) 变化了多少。导

数通过差商的极限来定义:

def difference_quotient(f, x, h):

return (f(x + h) - f(x)) / h

其中 h 趋近于 0。

导数就是在点 (x, f (x)) 的切线的斜率, 而差商就是通过点 (x, f (x)) 和点 (x+h, f (x+h)) 的割

线的斜率。当 h 越来越小,割线与切线就越来越接近(见图 8-2)。

很多函数可以精确地计算导数,比如平方函数 square:

def square(x):

return x * x

它的导数为:

def derivative(x):

return 2 * x

你可以通过计算来确认——如果你想的话——先显式地计算差商,再取极限。

如果算不出梯度(或不想算)呢? Python 中无法直接运算极限,但可以通过计算一个很小

derivative_estimate = partial(difference_quotient, square, h=0.00001)

# 绘出导入matplotlib.pyplot作为plt的基本相同的形态

x = range(-10,10)

plt.title("精确的导数值与估计值")

plt.plot(x, map(derivative, x), 'rx', label='Actual') # 用 x 表示

plt.plot(x, map(derivative_estimate, x), 'b+', label='Estimate') # 用 + 表示

plt.legend(loc=9)

plt.show()

当 f 是一个多变量函数时,它有多个偏导数,每个偏导数表示仅有一个输入变量发生微小

变化时函数 f 的变化。

我们把导数看成是其第 i 个变量的函数,其他变量保持不变,以此来计算它第 i 个偏导数:

def partial_difference_quotient(f, v, i, h):

"""compute the ith partial difference quotient of f at v"""

w = [v_j + (h if j == i else 0) # 只对v的第i个元素增加h

for j, v_j in enumerate(v)]

return (f(w) - f(v)) / h

再以同样的方法估算它的梯度函数:

def estimate_gradient(f, v, h=0.00001):

return [partial_difference_quotient(f, v, i, h)

for i, _ in enumerate(v)]

0.0000
3
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子