【发布时间】:2015-11-27 17:17:59
【问题描述】:
我正在处理一个涉及使用似然函数 (lik) 及其梯度 (grad) 的优化问题。这两个函数都使用Rcpp 库进行编码,并被馈送到R 中的optim(...,method="BFGS") 优化函数。
在计算似然性的过程中,会产生很多变量,这些变量对于以后的梯度计算也很有用。为了避免每次需要梯度评估时都重新计算这些变量,我想出了创建一个环境 (env) 的想法,lik 使用该环境与grad 进行“通信”。换句话说,每次评估 lik 时,它都会将所需的变量存储到环境 env 中
likelihoodscript<-
using Rcpp::Environment;
Environment e(env);
// likelihood function is computed
//var1 to varK are created
//they can be MatrixXd, SparseMatrix, double, etc.
e.assign("namevar1",var1);
e.assign("namevar2",var2);
...
e.assign("namevarK",varK);
return wrap(likvalue);
然后,当需要grad 评估时,我从grad 函数中搜索环境中所需的变量:
gradientscript<-
using Rcpp::Environment;
Environment e(env);
//var1 to varK are recovered from the environment
SEXP input_var1 = e.get("var1");
int var1 = as<int>(var1);
SEXP input_var2= e.get("var2");
MatrixXd var2 = as<MatrixXd>(var2);
...
SEXP input_varK = e.get("varK");
double varK = as<double>(varK);
// gradient function is computed
return wrap(gradvector);
理论上,如果我用相同的初始参数集开始优化问题,我应该每次都得到相同的结果(lik、grad 或optim() 内部没有随机操作),但碰巧结果有时会有所不同。可以这么说,如果我用完全相同的参数重复优化 20 次,15 次我有很好的结果,但其中 5 次我有一些不同(或非常不同)的东西。我在这些错误中搜索了“模式”,但它们看起来完全是随机的。
据我所知,这可能是由于环境哈希表中的键值识别错误,因此我尝试在 R 中使用 hash 包。一些改进(可能是好结果的 18 倍,而不是15),但还不是问题的确切解决方案。
如果有人知道问题出在哪里,请回答。 非常感谢。
P.D.我尝试了同样的事情,但使用list 而不是Environment:同样的问题,甚至更糟。
【问题讨论】:
-
您应该提供一个可重现的示例来证明您的问题。
标签: r hash hashtable environment rcpp