我如何在scipy.optimize.minimize函数中更新args值?

时间:2015-09-04 22:25:16

标签: python optimization scipy argument-passing minimize

在我的问题中,我需要更新cost函数中的args值,但是args是一个函数参数,并且还具有元组结构。我想知道有没有办法改变args的元素并更新它以通过jac函数使用它?例如,在以下代码中

paraList = [detValVec, projTrans, MeasVec, 
            coeMat, resVec, absCoeRec]
res = optimize.minimize(costFunc, x0, args=(paraList,), method='BFGS', jac=gradientFunc, options={'gtol': 1e-6, 'disp': True}) 
def costFunc(x0,arg):
    para = list(arg)
    para[3], para[4], para[5] = forwardModelFunc(para[0], para[1], para[2]) 
    return para[5]

我想在args论证中更新para [3],para [4],para [5]。

1 个答案:

答案 0 :(得分:0)

为了最小化new Thread(new Runnable() { @Override public void run() { try { URL url=new URL("server_url"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestProperty("Connection", "Keep-Alive"); conn.setRequestProperty("Cache-Control", "no-cache"); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="); conn.setReadTimeout(35000); conn.setConnectTimeout(35000); // directly let .compress write binary image data // to the output-stream OutputStream os = conn.getOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); os.flush(); os.close(); System.out.println("Response Code: " + conn.getResponseCode()); InputStream in = new BufferedInputStream(conn.getInputStream()); BufferedReader responseStreamReader = new BufferedReader(new InputStreamReader(in)); String line = ""; StringBuilder stringBuilder = new StringBuilder(); while ((line = responseStreamReader.readLine()) != null) stringBuilder.append(line).append("\n"); responseStreamReader.close(); String response = stringBuilder.toString(); Log.d("WEDDING","response "+response); conn.disconnect(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); ,您必须能够改变输入参数(否则它将始终具有相同的值!)。 costFunc功能会因optimize.minimize而有所不同("更新"},但会在调用x时保持args不变,这意味着您costFunc 1}}应该是paraList,而不是x

由于args仅取决于参数列表costFunc中的前三个值,因此更新最后三个para[:3]将无效,因此您可以使用para[3:]x = para[:3]。事实上,你根本不需要args = para[3:],因为它没有效果。

类似的东西:

args

因此,您获得的最佳结果(在paraList = [detValVec, projTrans, MeasVec, coeMat, resVec, absCoeRec] def costFunc(x): out = forwardModelFunc(x[0], x[1], x[2]) return out[2] x0 = paraList[:3] # the initial guess res = optimize.minimize(costFunc, x0, method='BFGS', jac=gradientFunc, options={'gtol': 1e-6, 'disp': True}) 中返回)将是res.x中前三个参数的最佳值:paraListdetValVecprojTrans。如果您想获得他们所暗示的最后三个值,您只需拨打MeasVec上的forwardModelFunc

res.x

当然,了解paraList_opt = list(res.x) + list(forwardModelFunc(*res.x) 的局限性非常重要:如果它是一个标量数组,那么它只能最小化数组optimize.minimize,所以希望你的值x是标量。如果没有,你必须扁平化并连接它们。此外,它会将相同的paramListx传递给jacobian args,因此请确保其格式正确。