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 字典(Dictionary)操作详解
Mar 11 Python
python操作gmail实例
Jan 14 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
解决Django的request.POST获取不到内容的问题
May 28 Python
对PyTorch torch.stack的实例讲解
Jul 30 Python
python使用epoll实现服务端的方法
Oct 16 Python
只需7行Python代码玩转微信自动聊天
Jan 27 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
python对象转字典的两种实现方式示例
Nov 07 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 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
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
javascript中Number的方法小结
2016/11/21 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
微信小程序 行的删除和增加操作实现详解
2019/09/29 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
分享几道你可能遇到的python面试题
2017/07/24 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
2020/02/27 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
浅谈python锁与死锁问题
2020/08/14 Python
Python文件操作的面试题
2013/06/22 面试题
致铅球运动员广播稿精选
2014/01/12 职场文书
食品业务员岗位职责
2014/03/18 职场文书
建房协议书
2014/04/11 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
群众路线个人剖析材料
2014/10/07 职场文书
毕业典礼主持词
2015/06/29 职场文书
网络舆情信息简报
2015/07/21 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
MySQL如何使备份得数据保持一致
2022/05/02 MySQL