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在校内发人人网状态(人人网看状态)
Feb 19 Python
从零学Python之入门(四)运算
May 27 Python
使用Python编写提取日志中的中文的脚本的方法
Apr 30 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
Sanic框架流式传输操作示例
Jul 18 Python
influx+grafana自定义python采集数据和一些坑的总结
Sep 17 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
Python文件操作方法详解
Feb 09 Python
python处理写入数据代码讲解
Oct 22 Python
python模块内置属性概念及实例
Feb 18 Python
python turtle绘图
May 04 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
Zerg兵种介绍
2020/03/14 星际争霸
PHP 全角转半角实现代码
2010/05/16 PHP
php+mysql数据库查询实例
2015/01/21 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
Yii2超好用的日期和时间组件(值得收藏)
2016/05/05 PHP
如何在PHP中使用数组
2020/06/09 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
js+css实现打字效果
2020/06/24 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
python利用beautifulSoup实现爬虫
2014/09/29 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
在Sublime Editor中配置Python环境的详细教程
2020/05/03 Python
python中rc1什么意思
2020/06/19 Python
python 5个实用的技巧
2020/09/27 Python
浅析Python中字符串的intern机制
2020/10/03 Python
详解Python中的Lock和Rlock
2021/01/26 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
Java基础面试题
2014/07/19 面试题
J2EE面试题大全
2016/08/06 面试题
毕业证丢失证明
2014/01/15 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
《狼》教学反思
2014/03/02 职场文书
工作推荐信范文
2014/05/10 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
老公写给老婆的检讨书
2015/05/06 职场文书
同学会演讲稿
2019/04/02 职场文书
WebWorker 封装 JavaScript 沙箱详情
2021/11/02 Javascript