【发布时间】: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