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中MySQLdb和torndb模块对MySQL的断连问题处理
Nov 09 Python
Django 如何获取前端发送的头文件详解(推荐)
Aug 15 Python
django模板语法学习之include示例详解
Dec 17 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
Python全局变量与局部变量区别及用法分析
Sep 03 Python
Django 路由控制的实现代码
Nov 08 Python
Python2与Python3的区别实例总结
Apr 17 Python
Python队列RabbitMQ 使用方法实例记录
Aug 05 Python
python 进程的几种创建方式详解
Aug 29 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
用Python生成会跳舞的美女
Jan 18 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 if 想到的些问题
2008/03/22 PHP
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
Vue 事件的$event参数=事件的值案例
2021/01/29 Vue.js
[54:45]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 Optic vs OG
2018/04/02 DOTA
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
Python 多进程原理及实现
2020/12/21 Python
日本卡普空电视游戏软件公司官方购物网站:e-CAPCOM
2018/07/17 全球购物
西安交大自主招生自荐信
2014/01/27 职场文书
实验心得体会
2014/09/05 职场文书
档案管理员岗位职责
2015/02/12 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
意外事故赔偿协议书
2016/03/22 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers