python实现梯度法 python最速下降法


Posted in Python onMarch 24, 2020

假设我们已经知道梯度法——最速下降法的原理。

现给出一个算例:

python实现梯度法 python最速下降法

如果人工直接求解:

python实现梯度法 python最速下降法

python实现梯度法 python最速下降法

现给出Python求解过程:

import numpy as np
from sympy import *
import math
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist

# 定义符号
x1, x2, t = symbols('x1, x2, t')

def func():
 # 自定义一个函数
 return pow(x1, 2) + 2 * pow(x2, 2) - 2 * x1 * x2 - 2 * x2

def grad(data):
 # 求梯度向量,data=[data1, data2]
 f = func()
 grad_vec = [diff(f, x1), diff(f, x2)] # 求偏导数,梯度向量
 grad = []
 for item in grad_vec:
  grad.append(item.subs(x1, data[0]).subs(x2, data[1]))
 return grad

def grad_len(grad):
 # 梯度向量的模长
 vec_len = math.sqrt(pow(grad[0], 2) + pow(grad[1], 2))
 return vec_len

def zhudian(f):
 # 求得min(t)的驻点
 t_diff = diff(f)
 t_min = solve(t_diff)
 return t_min

def main(X0, theta):
 f = func()
 grad_vec = grad(X0)
 grad_length = grad_len(grad_vec) # 梯度向量的模长
 k = 0
 data_x = [0]
 data_y = [0]
 while grad_length > theta: # 迭代的终止条件
  k += 1
  p = -np.array(grad_vec)
  # 迭代
  X = np.array(X0) + t*p
  t_func = f.subs(x1, X[0]).subs(x2, X[1])
  t_min = zhudian(t_func)
  X0 = np.array(X0) + t_min*p
  grad_vec = grad(X0)
  grad_length = grad_len(grad_vec)
  print('grad_length', grad_length)
  print('坐标', X0[0], X0[1])
  data_x.append(X0[0])
  data_y.append(X0[1])

 print(k)

 # 绘图
 fig = plt.figure()
 ax = axisartist.Subplot(fig, 111)
 fig.add_axes(ax)
 ax.axis["bottom"].set_axisline_style("-|>", size=1.5)
 ax.axis["left"].set_axisline_style("->", size=1.5)
 ax.axis["top"].set_visible(False)
 ax.axis["right"].set_visible(False)
 plt.title(r'$Gradient \ method - steepest \ descent \ method$')
 plt.plot(data_x, data_y, label=r'$f(x_1,x_2)=x_1^2+2 \cdot x_2^2-2 \cdot x_1 \cdot x_2-2 \cdot x_2$')
 plt.legend()
 plt.scatter(1, 1, marker=(5, 1), c=5, s=1000)
 plt.grid()
 plt.xlabel(r'$x_1$', fontsize=20)
 plt.ylabel(r'$x_2$', fontsize=20)
 plt.show()

if __name__ == '__main__':
 # 给定初始迭代点和阈值
 main([0, 0], 0.00001)

最终结果图如下所示:

python实现梯度法 python最速下降法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python发送邮件接收邮件示例分享
Jan 21 Python
Python中给List添加元素的4种方法分享
Nov 28 Python
Golang与python线程详解及简单实例
Apr 27 Python
Python标准库之itertools库的使用方法
Sep 07 Python
python抽取指定url页面的title方法
May 11 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
python使用minimax算法实现五子棋
Jul 29 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
Python检测端口IP字符串是否合法
Jun 05 Python
Python自动化办公Excel模块openpyxl原理及用法解析
Nov 05 Python
PyQt5+Pycharm安装和配置图文教程详解
Mar 24 #Python
python实现梯度下降法
Mar 24 #Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
Mar 25 #Python
pycharm通过anaconda安装pyqt5的教程
Mar 24 #Python
详解PyQt5信号与槽的几种高级玩法
Mar 24 #Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 #Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 #Python
You might like
php calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
js Math 对象的方法
2013/09/01 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
javascript实现文件拖拽事件
2018/03/29 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
Python简单进程锁代码实例
2015/04/27 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
Python中常用的内置方法
2019/01/28 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python:批量统计xml中各类目标的数量案例
2020/03/10 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
专科文秘应届生求职信
2013/11/18 职场文书
庆中秋节主题活动方案
2014/02/03 职场文书
单位工作证明书格式
2014/10/04 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
运动会加油稿
2015/07/22 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
Vue和Flask通信的实现
2021/05/19 Vue.js
源码解读Spring-Integration执行过程
2021/06/11 Java/Android
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB
Win Server2016远程桌面如何允许多用户同时登录
2022/06/10 Servers
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python