python - 如何显示 scipy.optimize 函数的进度?

标签 python numpy scipy output mathematical-optimization

我使用 scipy.optimize 来最小化一个有 12 个参数的函数。

我刚开始优化,还在等待结果。

有没有办法强制 scipy.optimize 显示其进度(例如已经完成了多少,当前的最佳点是什么)?

最佳答案

正如 mg007 所建议的,一些 scipy.optimize 例程允许回调函数(不幸的是,leastsq 目前不允许这样做)。下面是一个使用“fmin_bfgs”例程的示例,其中我使用回调函数来显示参数的当前值和每次迭代时目标函数的值。

import numpy as np
from scipy.optimize import fmin_bfgs

Nfeval = 1

def rosen(X): #Rosenbrock function
    return (1.0 - X[0])**2 + 100.0 * (X[1] - X[0]**2)**2 + \
           (1.0 - X[1])**2 + 100.0 * (X[2] - X[1]**2)**2

def callbackF(Xi):
    global Nfeval
    print '{0:4d}   {1: 3.6f}   {2: 3.6f}   {3: 3.6f}   {4: 3.6f}'.format(Nfeval, Xi[0], Xi[1], Xi[2], rosen(Xi))
    Nfeval += 1

print  '{0:4s}   {1:9s}   {2:9s}   {3:9s}   {4:9s}'.format('Iter', ' X1', ' X2', ' X3', 'f(X)')   
x0 = np.array([1.1, 1.1, 1.1], dtype=np.double)
[xopt, fopt, gopt, Bopt, func_calls, grad_calls, warnflg] = \
    fmin_bfgs(rosen, 
              x0, 
              callback=callbackF, 
              maxiter=2000, 
              full_output=True, 
              retall=False)

输出如下所示:

Iter    X1          X2          X3         f(X)      
   1    1.031582    1.062553    1.130971    0.005550
   2    1.031100    1.063194    1.130732    0.004973
   3    1.027805    1.055917    1.114717    0.003927
   4    1.020343    1.040319    1.081299    0.002193
   5    1.005098    1.009236    1.016252    0.000739
   6    1.004867    1.009274    1.017836    0.000197
   7    1.001201    1.002372    1.004708    0.000007
   8    1.000124    1.000249    1.000483    0.000000
   9    0.999999    0.999999    0.999998    0.000000
  10    0.999997    0.999995    0.999989    0.000000
  11    0.999997    0.999995    0.999989    0.000000
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 11
         Function evaluations: 85
         Gradient evaluations: 17

至少这样你可以看到优化器跟踪最小值

关于python - 如何显示 scipy.optimize 函数的进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16739065/

相关文章:

python - 服务器重启后如何使Flask应用启动并运行?

python - 根据索引和值条件选择 Pandas 系列的切片

python - "Dynamic"Python中沿轴的N维有限差分

python - 无法通过 pip 安装 Scipy

python - DataFrame 操作函数/方法

python - 如何从Python中的字典创建稀疏二进制矩阵

python - 使用 Twisted 在 Python 中实现多进程服务器

python - 通过 cmake 从 C++ 扩展构建 Python 子模块

python - 如何解决 Docker 镜像中的 Tesseract "Failed loading language ' eng'"问题

Python:将 numpy Flip 与 memmap 结合使用