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简单线程和协程学习心得(分享)
Jun 14 Python
Python 模拟登陆的两种实现方法
Aug 10 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
Apr 12 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
Django基础知识 URL路由系统详解
Jul 18 Python
Python zip函数打包元素实例解析
Dec 11 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
基于Python把网站域名解析成ip地址
May 25 Python
如何利用Python写个坦克大战
Nov 18 Python
Python的property属性详细讲解
Apr 11 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
PHP输出XML格式数据的方法总结
2017/02/08 PHP
PHP大文件及断点续传下载实现代码
2020/08/18 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
prototype 学习笔记整理
2009/07/17 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
python+pyqt实现右下角弹出框
2017/10/26 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
selenium+python自动化测试环境搭建步骤
2019/06/03 Python
在python中用url_for构造URL的方法
2019/07/25 Python
python找出因数与质因数的方法
2019/07/25 Python
Python django框架输入汉字,数字,字符生成二维码实现详解
2019/09/24 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
MIS软件工程师的面试题
2016/04/22 面试题
会计学专业学生的求职信范文
2014/01/27 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
计算机专业自荐信
2014/05/24 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
实习协议书
2015/01/27 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python