梯度下降扩展函数示例
Gradient descent extended function example
这是我的梯度下降代码:
import numpy
def gradient_descent(func, grad_func, w_init, n_epochs=100, lr=0.001, verbose=0):
i = 0
w = w_init
while i < n_epochs:
delta_w = -lr * grad_func(w)
w = w + delta_w
if verbose > 0:
print("f={}; w: {}".format(func(w), w))
i += 1
return w
现在向我解释的示例具有简单的功能,即:
f(p,q) = p^2 + q^2
。
偏导数在向量中:[2p,2q],这很清楚。
该函数及其梯度的代码是:
def f(w):
return numpy.sum(w*w)
def grad(w):
return 2*w
所以计算结果是:
# starting point
w_init = numpy.array([10,10])
# learning rate
lr = 0.1
# apply gradient descent
w_opt = gradient_descent(f, grad, w_init, n_epochs=25, lr=lr, verbose=1)
我的问题是为另一个函数计算它,例如:f(p,q) = (p^2 + 2q^3)
。我知道偏导数的值,但是如何将这些值实现到这个特定的代码中呢?
如何为其编写新函数f和梯度函数grad并用main函数计算?
可能您正在寻找这样的东西:
def f(w):
return w[0] ** 2 + 2 * w[1] ** 3
def grad(w):
return np.array([2 * w[0], 3 * w[1] ** 2])
这是我的梯度下降代码:
import numpy
def gradient_descent(func, grad_func, w_init, n_epochs=100, lr=0.001, verbose=0):
i = 0
w = w_init
while i < n_epochs:
delta_w = -lr * grad_func(w)
w = w + delta_w
if verbose > 0:
print("f={}; w: {}".format(func(w), w))
i += 1
return w
现在向我解释的示例具有简单的功能,即:
f(p,q) = p^2 + q^2
。
偏导数在向量中:[2p,2q],这很清楚。
该函数及其梯度的代码是:
def f(w):
return numpy.sum(w*w)
def grad(w):
return 2*w
所以计算结果是:
# starting point
w_init = numpy.array([10,10])
# learning rate
lr = 0.1
# apply gradient descent
w_opt = gradient_descent(f, grad, w_init, n_epochs=25, lr=lr, verbose=1)
我的问题是为另一个函数计算它,例如:f(p,q) = (p^2 + 2q^3)
。我知道偏导数的值,但是如何将这些值实现到这个特定的代码中呢?
如何为其编写新函数f和梯度函数grad并用main函数计算?
可能您正在寻找这样的东西:
def f(w):
return w[0] ** 2 + 2 * w[1] ** 3
def grad(w):
return np.array([2 * w[0], 3 * w[1] ** 2])