Loading

梯度下降pthon实现

from cmath import cos, exp, pi, sin
import numpy as np
from matplotlib import pyplot as plt

def G(x):
    x1,x2,x3 = x[0][0],x[1][0],x[2][0]
    g = np.array([[(3 * x1 - cos(x2*x3) - 3/2).real],
         [(4 * x1**2 - 625 * x2**2 + 2*x2 -1).real],
         [(exp(-x1*x2) + 20*x3 + (10*pi-3)/3).real]])
    return g

def F(x):
    g = G(x)
    g_T = np.array(list(zip(*g)))
    f = 1/2 * np.dot(g_T, g)
    return f

def J_G(x):
    x1,x2,x3 = x[0][0],x[1][0],x[2][0]
    jg = np.array([[3, (sin(x2*x3)*x3).real, (sin(x2*x3)*x2).real],
          [8*x1.real, -1250*x2.real+2, 0],
          [(-x2*exp(-x1*x2)).real, -(x1*exp(-x1*x2)).real, 20]])
    return jg
def F_prime(x):
    jg = J_G(x)
    jg_T = np.array(list(zip(*jg)))
    return np.dot(jg_T, G(x))

def Gama(x0, x1):
    deta_x = np.array(list(zip(*(x1-x0))))
    deta_F_prime = F_prime(x1-x0)
    module_F_prime = np.dot(np.array(list(zip(*deta_F_prime))), deta_F_prime)
    gama = np.dot(deta_x, deta_F_prime)[0][0]/module_F_prime[0][0]**2
    return gama

def gradient_descent():
    x0 = np.array([[0],
                   [0],
                   [0]])

    maxIt = 1000
    gama = 0.001
    for i in range(maxIt):
        print(F(x0)[0][0])
        x1 = x0 - gama * F_prime(x0)
        if F(x1)[0][0] > F(x0)[0][0]: return x0
        #gama = Gama(x0, x1)
        x0 = x1
    return x1

res = gradient_descent()
print(res)

 

posted @ 2020-09-25 11:22  ArkiWang  阅读(156)  评论(0编辑  收藏  举报