Rcpp гамма-интеграл

Я пытаюсь переписать в (R) CPP оригинальную функцию R, которая использует гамма-функцию (от двойного ввода). Ниже первоисточник. При компиляции с sourceCpp возникает следующая ошибка: "нет подходящей функции для вызова" gamma(Rcpp::traits::storage_type(<14>:.type) ""

Гамма-функция должна быть помещена в сахар (как среднее значение ниже), поэтому я ожидаю, что она должна быть легко вызвана.

#include <Rcpp.h>
#include <math.h>
using namespace Rcpp;


// original R function
// function (y_pred, y_true) 
// {
//   eps <- 1e-15
//   y_pred <- pmax(y_pred, eps)
//   Poisson_LogLoss <- mean(log(gamma(y_true + 1)) + y_pred - 
//     log(y_pred) * y_true)
//   return(Poisson_LogLoss)
// }


// [[Rcpp::export]]
double poissonLogLoss(NumericVector predicted, NumericVector actual) {
  NumericVector temp, y_pred_new;
  double out; 
  const double eps=1e-15;

  y_pred_new=pmax(predicted,eps);
  long n = predicted.size();
  for (long i = 0; i < n; ++i) {
    temp[i] = log( gamma(actual[i]+1)+y_pred_new[i]-log(y_pred_new[i])*actual[i]);
  }

  out=mean(temp); // using sugar implementation
  return out;
}

1 ответ

Решение

Вы делаете это слишком сложным, так как смысл Rcpp Sugar - векторизация работы. Таким образом, следующие компиляции также:

#include <Rcpp.h>
#include <math.h>
using namespace Rcpp;

// [[Rcpp::export]]
double poissonLogLoss(NumericVector predicted, NumericVector actual) {
  NumericVector temp, y_pred_new;
  double out; 
  const double eps=1e-15;

  y_pred_new=pmax(predicted,eps);
  temp = log(gamma(actual + 1)) + y_pred_new - log(y_pred_new)*actual;
  out=mean(temp); // using sugar implementation
  return out;
}

Теперь вы не предоставили никаких тестовых данных, поэтому я не знаю, правильно ли это вычисляется или нет. Кроме того, поскольку ваше выражение R уже векторизовано, это не будет намного быстрее.

Наконец, ваша ошибка компиляции, вероятно, из-за функции Sugar gamma() ожидая объекта Rcpp, тогда как вы предоставили double,

Другие вопросы по тегам