1. 程式人生 > 實用技巧 >二元函式的梯度下降法求解

二元函式的梯度下降法求解

import numpy as np
class g:

def test(self,x):
e = 2.71828182845904590
return x[0]**3+e**x[0]+x[1]**4+x[0]+x[1]-2


def gradient_descent_step1(self,x):
self.alpha=0.01
return [x[0]+self.alpha,x[1]],[x[0]-self.alpha,x[1]],[x[0],x[1]+self.alpha],[x[0],x[1]-self.alpha]

def outpower(self,x1,x2,x3,x4):
self.y1 = self.test(x1)
self.y2 = self.test(x2)
self.y3 = self.test(x3)
self.y4 = self.test(x4)
return self.y1,self.y2,self.y3,self.y4

def gradient_descent_step2(self,x,y1,y2,y3,y4):

gradient_x0 = (y1-y2)/(2*self.alpha)
gradient_x1 = (y3-y4)/(2*self.alpha)

self.step= 0.01
x[0] = x[0]-np.sign(gradient_x0)*self.step
x[1] = x[1]-np.sign(gradient_x1)*self.step

return [x[0],x[1]]

x=[0.0,0.0]
g=g()

for i in range(40):
x1,x2,x3,x4=g.gradient_descent_step1(x)
y1, y2, y3, y4=g.outpower(x1,x2,x3,x4)
x = g.gradient_descent_step2(x,y1,y2,y3,y4)
print ('x={:6f},{:6f},problem(x)={:6f}'.format(x[0],x[1],g.test(x)))