一维梯度下降
#待求函数
def obj_function(x):
e = 2.71828182845904590
return x**6 + 6*x + e**x - 3
#损失函数
def loss(x):
return (obj_function(x)-0)**2
#梯度下降,导数的概念公式
def gradient_descense(x):
alpha=0.00000001
step = 0.01
gradient = (loss(x+alpha)-loss(x-alpha))/(2*alpha)
return x-gradient*step
#初始化x
x=0.0
for i in range(10):
x = gradient_descense(x)
print ('x={:6f},problem(x):{:6f}'.format(x,obj_function(x)))
二维梯度下降
二维参数,意味着x为一个列表。所以在求梯度的时候,参数格式有所变化。
#目标待求函数
def obj_function(x):
e = 2.71828182845904590
return x[0]**3+e**x[0]+x[1]**4+x[0]+x[1]-2
#损失函数
def loss(x):
return (obj_function(x)-0)**2
#梯度下降,分两个方向
def gradient_descent(x):
alpha = 0.00000001
gradient_x0 = (loss([x[0]+alpha,x[1]])-loss([x[0]-alpha,x[1]]))/(2*alpha)
gradient_x1 = (loss([x[0],x[1]+alpha])-loss([x[0],x[1]-alpha]))/(2*alpha)
step= 0.01
x[0] = x[0]-gradient_x0*step
x[1] = x[1]-gradient_x1*step
return [x[0],x[1]]
#初始化x
x=[0.0,0.0]
for i in range(30):
x = gradient_descent(x)
print ('x={:6f},{:6f},problem(x)={:6f}'.format(x[0],x[1],obj_function(x)))
多维梯度下降
使用numpy库
# -*- coding:utf-8 -*-
import numpy as np
def obj_function(x):
return x[0]*x[1] + x[1]*(x[2]**3) + x[2] + x[3]**3 + 2*x[1] + x[2]**3 + 8*x[3] + x[3]**6 - 12
def loss(x):
return (obj_function(x)-0)**2
def gradient_descense(x):
alpha = 0.000000001
# 梯度矢量
gradients = np.zeros(x.shape)
# 逐个求取偏导数,放进梯度矢量
for i in range(len(gradients)):
#初始化梯度步长向量
delta_vector = np.zeros(x.shape)
delta_vector[i] = alpha
gradients[i] = (loss(x+delta_vector)-loss(x-delta_vector)) / (alpha*2)
step = 0.001
x = x - gradient * step
return x
x = np.array([0.0, 0.0, 0.0, 0.0])
for i in range(50):
x = gradient_descense(x)
print ('x = {}, obj_function(x) = {:6f}'.format(x,obj_function(x)))