在我的问题中,我需要更新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]。
答案 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
中前三个参数的最佳值:paraList
,detValVec
和projTrans
。如果您想获得他们所暗示的最后三个值,您只需拨打MeasVec
上的forwardModelFunc
:
res.x
当然,了解paraList_opt = list(res.x) + list(forwardModelFunc(*res.x)
的局限性非常重要:如果它是一个标量数组,那么它只能最小化数组optimize.minimize
,所以希望你的值x
是标量。如果没有,你必须扁平化并连接它们。此外,它会将相同的paramList
和x
传递给jacobian args
,因此请确保其格式正确。