Python学习笔记(九)一维、二维、多维梯度下降

一维梯度下降

#待求函数
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)))

这里写图片描述

增强的格式化字符串format函数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值