【问题标题】:Rcpp - Using the optim functionRcpp - 使用优化功能
【发布时间】:2020-04-27 10:34:02
【问题描述】:

如何使用R语言的varargs函数,和optim函数一样?

考虑下面的代码,我想最大化对数似然函数verossimilhanca

#include <Rcpp.h>
#include <RInside.h>

using namespace Rcpp;

// [[Rcpp::export]]

double verossimilhanca(Function pdf, NumericVector par, NumericVector x){
  NumericVector log_result = log(pdf(par,x));
  double soma =0;
  for(int i = 0; i < log_result.size(); i++){
    soma += log_result[i];
  }

  return -1*soma;
} 
// [[Rcpp::export]]
List bootC(NumericVector x, NumericVector init_val){ 
  Rcpp::Environment stats("package:stats"); 
  Rcpp::Function optim = stats["optim"];    

  R["my_objective_fn"] = Rcpp::InternalFunction(&verossimilhanca);

  Rcpp::List opt_results = optim(Rcpp::_["par"]  = init_val,
                                 Rcpp::_["fn"]     = Rcpp::InternalFunction(&verossimilhanca),
                                 Rcpp::_["method"] = "BFGS", x);

  return opt_results;
  // x is a data vetor.
}

总之,我有一个对数似然函数,我想最大化这个函数,x 是我的数据集。我知道 RInside 允许我在 C++ 中创建 R 的实例,但我只想通过使用 Rcpp.h 库而不诉诸 RInside.h 来解决这个问题。

【问题讨论】:

  • 简而言之,这是个坏主意。您将获得 优化,其速度几乎与 R 相同,而您在 C++ 中调用它的速度更快。如果您想要 C++ 访问,请查看(开发版本)nloptr(您可以从 C 访问)。
  • 另外,对于 R 中的标准 Rcpp 使用,您永远不需要 RInside.h
  • 感谢您的提示。她会很有帮助的。但只是为了扼杀我对一个问题的好奇心:我知道可以使用 R 函数并使用 Rcpp 为 C++ 代码调用此函数。如果R的这个函数接受argvar(可变参数)(...),有没有办法通过Rcpp将此函数导入C ++并且这个函数prezervar这个特性,即是否可以使用a(可变参数) (...) 在 C++ 中导入的函数?

标签: c++ r


【解决方案1】:

在 optim 函数的参数中将 x 替换为 Rcpp::_["x"] = x。 在我找到the answer of @coatless之前,我也很困扰。

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多