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异步回调机制实现和使用方法
Nov 26 Python
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python与shell的3种交互方式介绍
Apr 11 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
详解python中的 is 操作符
Dec 26 Python
Python爬虫之网页图片抓取的方法
Jul 16 Python
使用pyqt5 tablewidget 单元格设置正则表达式
Dec 13 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
Python如何实现机器人聊天
Sep 10 Python
python3使用diagrams绘制架构图的步骤
Apr 08 Python
python基础学习之生成器与文件系统知识总结
May 25 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中Enum(枚举)用法实例详解
2015/12/07 PHP
PHP attributes()函数讲解
2019/02/03 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
php中yii框架实例用法
2020/12/22 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
详解javascript常用工具类的封装
2018/01/30 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
回顾Javascript React基础
2019/06/15 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python实现ipsec开权限实例
2014/11/11 Python
Python类的专用方法实例分析
2015/01/09 Python
python通过线程实现定时器timer的方法
2015/03/16 Python
matplotlib中legend位置调整解析
2017/12/19 Python
Python pandas常用函数详解
2018/02/07 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
Python关于拓扑排序知识点讲解
2021/01/04 Python
Python的collections模块真的很好用
2021/03/01 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
通信工程毕业生自荐信
2013/11/01 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
多线程Spring通过@Scheduled实现定时任务
2022/05/25 Java/Android