type
status
date
slug
summary
tags
category
icon
password

路径

输出:
进入active env location的路径。(Linux同理)
C:\ProgramData\anaconda3\Lib\site-packages\scipy\optimize
主要修改这个路径下的两个文件:
_minimize.py_optimize.py
 

代码结构

_minimize.py

打开 _minimize.py 可看到,这个文件是用来汇总其他文件定义的各种优化方法的。分成了两大类:非约束和约束最小化方法。
首先是把其他文件的内容import进来,比如_optimize.py里的_minimize_bfgs等
notion image
然后给这些方法统一定义了一个接口minimize():
notion image
比如写一个简单的例子:
result = minimize(objective_function, initial_guess, method='BFGS')的参数中,objective_function是待优化的函数,initial_guess是初始猜测值,method指定优化方法为'BFGS'。
 
minimize()方法的详细定义见源码,它的作用就是根据设定的参数选择不同的优化方法。
文档:
 

_optimize.py

既然_minimize.py调用了_optimize.py就把_optimize.py打开看看:
notion image
发现_optimize.py就是一堆优化函数的集合。
_optimize.py里import了_minimize_bfgs(第一张图),直接搜这个函数:
发现在1300行左右定义:
notion image
这里就是scipy里BFGS优化器的完整定义了。
比如在第一行加一个print("------bfgs------")然后保存(可能要管理员权限)。
重新运行刚才的代码:
notion image
发现成功确实是这个函数。
 
同理,其他优化方法也是这么定义和调用的。
 

修改

依照这个思路定义一个自己的函数。
他的函数叫_minimize_bfgs,我们直接在他下面定义一个_minimize_my函数(先把_minimize_bfgs直接复制一份改名字就行):
notion image
函数内容都一样,把第一句print改成print("------my------")来测试是否成功。
 
这里函数定义好了,但是用的时候是在_minimize.py统一调用的。回到_minimize.py文件:
找到开头调用_minimize_bfgs的地方,加入自己刚定义的_minimize_my.
notion image
 
还差最后一步。
想想我们是怎么用这些方法的:
result = minimize(objective_function, initial_guess, method='BFGS')
method传入的是一个字符串(方法名字),比如这里的’BFGS’。
那么scipy是怎么根据这个字符串(方法名字)找到代码中的_minimize_bfgs()这个函数的?
 
还是回到minimize的定义源码,发现其实很简单:
notion image
就是用一个接一个的if来判断method等于的啥,就相应地调用哪个函数。如上图的’BFGS’相应调用_minimize_bfgs()。
那么我们直接在这里加入我们的一个if:
notion image
这样就可以这么用了:
result = minimize(objective_function, initial_guess, method='my-mini')
保存这些改动,测试一下:
 
notion image
输出------my----—,说明成功调用了我们自己定义_minimize_my()函数。接下来可以加入自定义的函数内容了。
 
总结:
notion image
 
速通C++:命名空间看啥片