Rcpp伽玛积分
Rcpp gamma integral
我正在尝试将使用伽玛函数(来自双输入)的原始 R 函数重写为 (R)cpp。下面是原始出处。与 sourceCpp 进行比较时,会出现以下错误 "no matching function for call to 'gamma(Rcpp::traits::storage_type(<14>:.type)'"
gamma 函数应该放在 sugar 中(如下面的平均值),所以我希望可以很容易地调用它。
#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;
}
你把这件事搞得太复杂了,因为 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
.
我正在尝试将使用伽玛函数(来自双输入)的原始 R 函数重写为 (R)cpp。下面是原始出处。与 sourceCpp 进行比较时,会出现以下错误 "no matching function for call to 'gamma(Rcpp::traits::storage_type(<14>:.type)'"
gamma 函数应该放在 sugar 中(如下面的平均值),所以我希望可以很容易地调用它。
#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;
}
你把这件事搞得太复杂了,因为 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
.