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 translator使用实例
Sep 06 Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 Python
python docx 中文字体设置的操作方法
May 08 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
python使用 zip 同时迭代多个序列示例
Jul 06 Python
用Python配平化学方程式的方法
Jul 20 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
PyQt5实现暗黑风格的计时器
Jul 29 Python
python3用urllib抓取贴吧邮箱和QQ实例
Mar 10 Python
使用gunicorn部署django项目的问题
Dec 30 Python
Django 实现jwt认证的示例
Apr 30 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 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判断字符以及字符串的包含方法属性
2008/08/30 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php生成随机密码的三种方法小结
2010/09/04 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
php设置允许大文件上传示例代码
2014/03/10 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP常用的小程序代码段
2015/11/14 PHP
prototype1.4中文手册
2006/09/22 Javascript
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
jQuery的控件及事件(输入控件及回车事件)使用示例
2013/07/25 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
Bootstrap提示框效果的实例代码
2017/07/12 Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
2019/04/19 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
python字符串连接方法分析
2016/04/12 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
pip安装tensorflow的坑的解决
2020/04/19 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
屈臣氏乌克兰:Watsons UA
2019/10/29 全球购物
经济信息管理专业大学生求职信
2013/09/27 职场文书
仓管员岗位职责范文
2013/11/08 职场文书
研究生求职推荐信范文
2013/11/30 职场文书
初中科学教学反思
2014/01/21 职场文书
亲戚结婚的请假条
2014/02/11 职场文书
2014年教师节国旗下讲话稿
2014/09/10 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
大学生受助感言
2015/08/01 职场文书
Python list去重且保持原顺序不变的方法
2021/04/03 Python