文档章节

Python 优化 回溯下降算法

 阿豪boy
发布于 06/25 19:58
字数 564
阅读 7
收藏 0
点赞 0
评论 0

使用sympy构造表达式,实现回溯下降算法

 

画出函数图像,先使用暴力搜索,找到最小值约为2.5左右

然后选定初始点,开始进行回溯搜索,下降方向为负梯度方向

下降的误差与步数大致呈现下面的状态

完整代码

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from sympy import *
import math

# 构造函数表达式
x1 = symbols('x1')
x2 = symbols('x2')
fx = E ** (x1 + 3 * x2 - 0.1) + E ** (x1 - 3 * x2 - 0.1) + E ** (-x1 - 0.1)
# 求偏导数
dx = diff(fx, x1)
dy = diff(fx, x2)


# 显示函数图像
def show():
    fig = plt.figure()
    ax = Axes3D(fig)
    max_x = 1
    X = np.linspace(-max_x, max_x, 100)
    Y = np.linspace(-max_x, max_x, 100)

    Z = np.array([
        np.array([float(fx.evalf(subs={x1: i, x2: j}))
                  for j in Y])
        for i in X
    ])

    X, Y = np.meshgrid(X, Y)
    ax.plot_surface(X, Y, Z, rstride=3, cstride=3, cmap='rainbow')
    plt.show()


# 给定a,b求回溯直线下降
def down(a, b):
    # 初始值
    x = np.array([1, 1])
    t = 1
    vals = [fx.evalf(subs={x1: x[0], x2: x[1]})]
    d = [-dx.evalf(subs={x1: x[0], x2: x[1]}), -dy.evalf(subs={x1: x[0], x2: x[1]})]
    while (d[0] ** 2 + d[1] ** 2) > 1:
        d = [-dx.evalf(subs={x1: x[0], x2: x[1]}), -dy.evalf(subs={x1: x[0], x2: x[1]})]
        xk = np.array(x) + np.array(d) * t
        while fx.evalf(subs={x1: xk[0], x2: xk[1]}) > \
                fx.evalf(subs={x1: x[0], x2: x[1]}) - \
                a * t * (d[0] ** 2 + d[1] ** 2):
            xk = x + np.array(d) * t
            t = b * t
        x = x + np.array(d) * t
        vals.append(fx.evalf(subs={x1: x[0], x2: x[1]}))

    return vals


# 暴力求解最小值
def test():
    minf = 1 << 64
    minx1 = 0
    minx2 = 0
    for i in np.linspace(-10, 10, 1000):
        for j in np.linspace(-10, 10, 1000):
            f = math.e ** (i + 3 * j - 0.1) + math.e ** (i - 3 * j - 0.1) + math.e ** (-i - 0.1)
            if f < minf:
                minx1 = i
                minx2 = j
                minf = f
    print(minf, minx1, minx2)


# 保存图像
def saveImg(a, b, arr):
    print(a, b, len(arr))
    plt.figure()
    plt.plot([i for i in range(len(arr))], [i for i in arr])
    plt.xlabel('k')
    plt.ylabel('fx')
    plt.title(f"a={a}\nb={b}")
    plt.savefig(f'./imgs/{a}_{b}.png')
    plt.close()


#  根据不同的ab,保存图片
def fun():
    for i in np.linspace(0.1, 0.4, 4):
        for j in np.linspace(0.1, 0.9, 9):
            saveImg(i, j, down(i, j))


test()
# fun()

# show()

 

© 著作权归作者所有

共有 人打赏支持
粉丝 21
博文 946
码字总数 656784
作品 0
西安
Python下的正则表达式原理和优化笔记

最近的时间内对正则表达式进行了一点点学习。所选教材是《mastering regular expressions》,也就是所谓的《精通正则表达式》。读过一遍后,顿感正则表达式的强大和精湛之处。其中前三章是对...

小弘
2013/06/19
0
16
Python 代码优化常见技巧

代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗 80% 的工作量。优化通...

大数据之路
2012/07/30
0
0
Python编程规范及性能优化

Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -- coding:utf-8 -- 。设置编辑器,默认保存为 utf-8 格式。 注释 业界普遍认同 Python 的注释分为...

陶邦仁
2013/01/16
0
1
Hacker News与Reddit的算法比较

Hacker News是Y Combinator旗下的一个新闻频道,属于digg类产品, SEOmoz曾经在2008年7月隆重推出Reddit、Stumbleupon、Del.icio.us和Hacker News算法全揭秘。由此,这些知名Web2.0网站的算法...

老枪
2011/05/02
0
0
Python处理正则表达式超时的办法

title: Python处理正则表达式超时的办法 tags: [python3, 正则表达式超时, re模块] date: 2018-04-27 21:40:21 categories: Python keywords: python3, 正则表达式, re模块, linux信号 最近在...

PigPeek
04/27
0
0
异步社区本周半价电子书(5月28日-6月03日)

《Kafka入门与实践》 作者:牟大恩 点此链接购买纸书 本书以Kafka 0.10.1.1版本以基础,对Kafka的基本组件的实现细节及其基本应用进行了详细介绍,同时,通过对Kafka与当前大数据主流框架整合...

异步社区
05/29
0
0
深入理解TensorFlow架构设计与实现原理 3 :基础概念

1、编程范式:数据流图 声明式编程与命令式编程的对比讨论 数据流图: tensorflow 1.2.0 2、数据载体:张量 张量:Tensor 稀疏张量:SparseTensor类,以键值对的形式表示高维稀疏数据,它包含...

qfire
05/28
0
0
机器学习者必知的5种深度学习框架

雷锋网按:本文为雷锋字幕组编译的技术博客,原标题The 5 Deep Learning Frameworks Every Serious Machine Learner Should Be Familiar With,作者为James Le。 翻译 | 杨恕权 张晓雪 陈明霏...

雷锋字幕组
05/03
0
0
国外程序员整理的机器学习资源大全

 英文原文:awesome-machine-learning   本文汇编了一些机器学习领域的框架、库以及软件(按编程语言排序)。   C++   计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的...

chworld
2015/08/07
0
0
Python 进程线程协程 GIL 闭包 与高阶函数(五)

1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程...

善良小郎君
06/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ClassNotFoundException: javax.el.ELManager

这个是因为tomcat7中的el-api2.2,有些版本太低,建议升级tomcat到8.0,利用el-api3.0就会解决这个问题。

无语年华
7分钟前
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
19分钟前
0
0
CentOS 7.4 设置系统字符编码

1.语言变量LANG在 /etc/locale 文件中。 2.可以通过/ect/profile 来修改LC_TYPE 变量的值 添加如下代码 export LC_ALL="zh_CN.GBK" export LANG="zh_CN.GBK" 到profile文件中,变量的可以修改...

qimh
20分钟前
0
0
Kafka相关使用

安装前提,需要有jdk环境,还有zookeeper环境 zookeeper下载地址:https://www.apache.org/dyn/closer.cgi/zookeeper/ zookeeper安装参考:https://www.jianshu.com/p/f7037105db46 kafka的下......

朝如青丝暮成雪
20分钟前
0
0
CentOS7 解决无法使用tab自动补全 tab代码提示

一、前言 对于刚刚开始学习linux的新人来说,linux的一切都显着神秘,只能惊叹于大牛在Linux上行云流水的操作。今天介绍一下在linux中自动补全的功能。 对于新人来说,在不懂得技巧的情况下,...

ziluopao
26分钟前
0
0
redis安装

https://www.cnblogs.com/feijl/p/6879929.html

ghou-靠墙哭
27分钟前
0
0
Spring核心——注解自动装载

从配置上扩展 之前的文章介绍了Spring的IoC容器配置管理方面的详细内容,需要了解的可以从IoC容器的设计模式开始阅读。在介绍基于注解配置的配置之前我们再重复一下在之前提到的基本认识: ...

随风溜达的向日葵
30分钟前
2
0
ElasticSearch学习(8)—— SearchType

Elasticsearch有四种类型的SearchType 1、query and fetch 向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。这种搜索方式是最...

叶枫啦啦
31分钟前
0
0
MYSQL备份工具-mysqldump

介绍 mysqldump 是文本备份还是二进制备份 它是文本备份,如果你打开备份文件你将看到所有的语句,可以用于重新创建表和对象。它也有 insert 语句来使用数据构成表。 语法 mysqldump 的语法是...

郭恩洲_OSC博客
33分钟前
0
0
我的第一个go web框架

使用了beego等go web开发框架之后,感觉各种不方便,尤其是在接收参数、和自定义输出的时候,各种难受,定义各种model,这不是找事情嘛??尤其是在角色权限控制的时候我也感觉力不从心。。。...

独坐苔痕但观罗敷
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部