关于sci-opt的模拟退火算法SA的参数解释

0. 关于sci-opt

  1. 一个比较好的模拟退火教程https://www.cnblogs.com/autoloop/p/15169642.html
  2. 本文讲解参数使用官方用例:https://github.com/guofei9987/scikit-opt#4-sasimulated-annealing

1. sci-opt的SA算法使用

  1. 代价函数/ loss function,在这里是
demo_func = lambda x: x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2
  • 要用SA优化/ 寻找的值是x[0],x[1],x[2]
  • 换句话说,它的物理意义是在三维空间中,用SA去寻找一个点,这个点要距离(0,0.05,0)最近。
  1. 使用SA时可以看到(省掉了import代码)
# 先实例化一个sa
sa = SA(func=demo_func, x0=[1, 1, 1], T_max=1, T_min=1e-9, L=300, max_stay_counter=150)
  • func=demo_func表示目标函数传入,这里注意目标函数的正负,来达到“目标函数越小越好”的效果。如果目标函数是log likelihood,注意加负号变成NLL
  • x0=[1, 1, 1]表示初始值,因为要对3个参数x[0],x[1],x[2]进行寻优,所以这里传的是3个数。
  • 从sa的执行细节可以看到寻优所经历的历史,如下,x确实是从[1,1,1]开始的,并且经历了58次寻找,在最后一次找到了最优值
    在这里插入图片描述
  • T_max=1, T_min=1e-9,前者的定义是“最大温度", 这个参数实际上也是“初始温度”。这两个参数的官方默认值分别是1001e-7。因此设置一个好的T_max还是很有必要的
self.T_max = T_max  # initial temperature
self.T = self.T_max
  • L=300:默认值就是300,表示“链长”:num of iteration under every temperature(also called Long of Chain),每个温度下最多允许寻找L次,可以设置为1试试看,减少每个温度下的试探次数会大大影响结果(goes bad)
  • max_stay_counter=150:默认值150,表示“冷却耗时”:stop if best_y stay unchanged over max_stay_counter times (also called cooldown time),这个参数和上一个L紧密相关,当算法在当前温度下保持不变持续了150次时,认为算法结束,找到了最优的参数x or 最低的温度y。
# run()之后返回答案
best_x, best_y = sa.run()
print('best_x:', best_x, 'best_y', best_y)
# print结果:
# best_x: [-0.08368016 -0.12619251  0.39975074] best_y 0.19784682316511348
  • 可以看到实例化sa后进行run,会进行调优,然后静静收割结果就可以。之前讲过最好寻优结果下,坐标点应该无限接近于(0,0.05,0),可以看到best_x的确如此,此时对应的温度/ demo_func的值为best_y
  • 具体的,sa这个实例化的对象(?这个说法正确吗)具有一些其他的优秀信息
    在这里插入图片描述
plt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))
plt.show()
  • 最后画图,官方用的sa.best_y_history,我疑惑和sa.generation_best_Y有什么区别。因为官方demo给的例子很简单,这两个list比较一下会发现完全相同,而且寻优过程很快就收敛了,等日后用复杂的优化过程时,应该就能看出来了。

时间仓促,上述如果有哪里出错的欢迎大家留言

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值