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 26 Python
Python打印“菱形”星号代码方法
Feb 05 Python
python list元素为tuple时的排序方法
Apr 18 Python
Flask框架工厂函数用法实例分析
May 25 Python
如何使用Python实现斐波那契数列
Jul 02 Python
python单例模式的多种实现方法
Jul 26 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
Feb 25 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
python程序如何进行保存
Jul 03 Python
python 定义函数 返回值只取其中一个的实现
May 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
python daemon守护进程实现
2016/08/27 Python
Python爬取三国演义的实现方法
2016/09/12 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
教师自荐信
2013/12/10 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
汉语专业毕业生自荐信
2014/07/06 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
融资合作协议书范本
2014/10/17 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
获奖感言一句话
2015/07/31 职场文书
提档介绍信范文
2015/10/22 职场文书
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL