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 基础知识之字符串处理
Jan 06 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
Python使用django框架实现多人在线匿名聊天的小程序
Nov 29 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 Python
使用python快速实现不同机器间文件夹共享方式
Dec 22 Python
PyInstaller运行原理及常用操作详解
Jun 13 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
详解Python模块化编程与装饰器
Jan 16 Python
Python中全局变量和局部变量的理解与区别
Feb 07 Python
再也不用花钱买漫画!Python爬取某漫画的脚本及源码
Jun 09 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 socke 向指定页面提交数据
2008/07/23 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
PHP的重载使用魔术方法代码实例详解
2021/02/26 PHP
js不是基础的基础
2006/12/24 Javascript
解决css和js的{}与smarty定界符冲突问题的两种方法
2013/09/10 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
css如何让浮动元素水平居中
2015/08/07 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
详解Nodejs基于mongoose模块的增删改查的操作
2016/12/21 NodeJs
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
JS实现躲避粒子小游戏
2020/06/18 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python中用altzone()方法处理时区的教程
2015/05/22 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
html5 学习简单的拾色器
2010/09/03 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
药学专业个人的自我评价
2013/12/31 职场文书
股东合作协议书
2014/04/14 职场文书
岗位安全生产责任书
2014/07/28 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
销售人员工作自我评价
2014/09/21 职场文书
2015年初中教务处工作总结
2015/07/21 职场文书