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实现的一个找零钱的小程序代码分享
Aug 25 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
Jul 20 Python
Python 多核并行计算的示例代码
Nov 07 Python
python opencv设置摄像头分辨率以及各个参数的方法
Apr 02 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
Python的多维空数组赋值方法
Apr 13 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
Oct 14 Python
Python拼接字符串的7种方式详解
Mar 19 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
python如何读取和存储dict()与.json格式文件
Jun 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添加MySQL数据记录代码
2008/06/07 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php图片上传类 附调用方法
2016/05/15 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
Vue异步组件使用详解
2017/04/08 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
2017/05/02 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
移动端如何用下拉刷新的方式实现上拉加载
2018/12/10 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
Vue打包后访问静态资源路径问题
2019/11/08 Javascript
wxPython窗口的继承机制实例分析
2014/09/28 Python
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Python实现二维数组输出为图片
2018/04/03 Python
python实现飞机大战微信小游戏
2020/03/21 Python
Python理解递归的方法总结
2019/01/28 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
2020/02/25 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
全球领先的中国制造商品在线批发平台:DHgate
2020/01/28 全球购物
法院执行局工作总结
2015/08/11 职场文书
厉行节约工作总结
2015/08/12 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
Python之matplotlib绘制折线图
2022/04/13 Python
Elasticsearch 数据类型及管理
2022/04/19 Python