机器学习中的目标函数(target function),又称损失函数(loss/cost function),参数的求解是从目标函数的优化开始。But,如何在程序中编写目标函数,小结一下:
1. 假设存在一个目标函数:
如何将其写在程序中,python形式如下:
# 定义目标函数
def rosen(x):
''' The Rosenbrock function '''
return sum(100.0 * (x[1:] - x[:-1]**2.0)**2.0 + (1 - x[:-1])**2.0)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = minimize(rosen, x0, method = 'nelder-mead',\
options = {'xtol': 1e-8, 'disp': True}) # 目标函数rosen, 初始值x0, 优化方法nelder-mead
print res.x # 得到的是最小值对应的解
如果使用BFGS算法优化该目标函数时,需要求目标函数对应的梯度,梯度计算如下:
上式推导中的第二步,没看明白,是不是δ(i,j)的i==j时,该值为1; i != j时,该值为0?
那么,目标函数的梯度形式为:
def rosen_der(x): # x为向量/数组
xm = x[1:-1] # 去除x的首尾元素
xm_ml = x[:-2]
xm_pl = x[2:]
der = np.zeros_like(x)
der[1:-1] = 200*(xm - xm_ml**2) - 400*(xm_pl - xm**2)*xm - 2*(1-xm)
der[0] = -400*x[0]*(x[1] - x[0]**2) - 2*(1-x[0])
der[-1] = 200*(x[-1] - x[-2]**2)
return der
# 使用BFGS算法求解
res1 = minimize(rosen, x0, method = 'BFGS', jac = rosen_der, \
options = {'disp':True})
print res1.x