【问题标题】:Using Scipy.optimize method='SLSQP' returns initial guess使用 Scipy.optimize method='SLSQP' 返回初始猜测
【发布时间】:2013-12-28 23:19:51
【问题描述】:

我尝试根据 scipy 的多个变量对函数进行更多优化

在使用批处理文件调用此工具后,我有一个函数从数据挖掘工具返回预测。

def query(x):
    import numpy as np
    file_direc_in="path_to_input_file.csv"
    file_direc_out="path_to_output_file.csv"


    with open(file_direc_in, 'w') as f:
        np.savetxt(f, x, delimiter=';', fmt='%.3f',newline='\r\n')
    f.close()
    os.system("Dataset_query.bat")
    #batch file takes the array i wrote to from input_file and estimates a result
    #afterwards the output will be taken from the output file:
    f = open(file_direc_out,'r')
    out = np.array([[float(f.readlines()[0])]])
    f.close()
    return out


from scipy.optimize import minimize
from calc import query
import numpy as np

x0=np.array([[1.5,50,30]])

bnds = ((1, 2), (0.1, 100), (20, 100))

res=minimize(query,x0,method='SLSQP',bounds=bnds, options={'maxiter': 10 , 'disp': True}, callback=True)

当我运行脚本时,我在控制台中看到了循环,但似乎没有为我的变量测试过真正的值,我得到了最初的猜测:

Optimization terminated successfully.    (Exit mode 0)
            Current function value: [[ 1636.724]]
            Iterations: 1
            Function evaluations: 5
            Gradient evaluations: 1

虽然我知道这个问题的最小值在于x_minimum=[1,0.1,100] out 的值约为out=400 (我必须减少变量的第一个和第二个值并增加第三个值以获得更低的out

我在这里做错了什么?

【问题讨论】:

  • 如果不知道Dataset_query.bat(顺便说一句,os.system() 调用需要用引号括起来),就不可能知道出了什么问题。其他几点:您应该在文件顶部进行模块导入,绝对不是在函数内部(除非您有充分的理由)。我还会使用args=() 将额外的参数(例如file_direc_in)传递给minimize
  • 我突然想到了另一个想法。当您在query(x) 中写出x 的更新版本时,会将其截断到小数点后3 位。如果minimize 仅对其中一个参数进行了非常小的更改,则此更改不会结转到您实际计算损失的Dataset_query.bat。因此,当minimize 估计query(x) w.r.t 的偏导数时。 x 通过有限差分,如果步长足够小,它可能会错误地将梯度估计为 0,因此优化不会进行。尝试将x 改写为小数点后 10 位。
  • 你的意思是像:x0=np.array([[1.50000000,50.00000000,30.00000000]]) 吗?想象一下,批处理文件调用 DM 程序来返回给定输入向量 x 的估计值。许多与输入向量 x 具有相同形状的“测量”数据集被用于确定最佳估计值。如果它是多重回归,我可以将其提取为函数并确定它的导数......但这并不容易 - 我想我无法确定代数方程,因为估计量也可能是 A 支持向量回归或机器学习中使用的一些其他工具。
  • 我仍然不完全明白你想要做什么。你能给我一些关于你试图解决的问题的信息吗?如果我理解正确,file_direc_out 包含一些函数 yhat = f(x) 的结果。您需要 query 返回一个标量 l = g(f(x)),您希望在 x 上最小化该标量。例如,对于拟合问题,您通常会使用误差平方和 l = sum((y - yhat)^2).
  • 我听从了您关于精度的建议(我认为这非常好!)并将其设置为 fmt='%.20f',然后在运行后输入 res.x(或在我的最后一个 csv 输入文件中)查看优化脚本,你似乎是对的: np.array([[1.50000000000000000000;50.00000000000000000000;30.00000001000000082740]]) 我可以告诉算法增加步骤吗?我想过使用另一种算法,但对于我的问题,我需要能够设置界限和约束。查看文档scipydoconly 'SLSQP' 是可以的。

标签: python optimization numpy scipy


【解决方案1】:

我的解决方案是改变步长,因为我的预测函数query 不平滑

res=minimize(query,args=(hist,ana),x0=x0,method='SLSQP',/
bounds=bnds, options={'disp': True ,'eps' : 1e0}) 

在我的情况下,搜索局部最小值没有意义,我现在正在整数步长中搜索最小值。

根据@ali_m 搜索全局最小值basinhopping 可以改为使用。 我会在接下来的几天里尝试一下

【讨论】:

    猜你喜欢
    • 2019-12-16
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多