2017-04-27 8 views
0

(이중 입력에서) 감마 함수를 사용하는 원본 R 함수를 (R) cpp로 다시 작성하려고합니다. 원래 소스 아래. sourceCpp를 컴파일 할 때 다음 오류가 발생합니다. "감마 (Rcpp :: traits :: storage_type (< 14> :. 유형) 호출에 일치하는 함수 없음" "Rcpp gamma integral

감마 함수가 설탕에 들어 있어야합니다 .. 당신은 일이 벡터화 Rcpp 설탕의 지점이 너무 복잡하고 있습니다 사용 아래의 수단으로) 그래서 쉽게이 호출 할 필요가 기대

#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; 
} 

답변

3

그래서 다음뿐만 아니라 컴파일 :

#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 표현식이 이미 벡터화되었으므로 훨씬 빠르지 않습니다.

마지막으로 사용자가 double을 제공했지만 Sugar 함수 gamma()이 Rcpp 개체를 예상하기 때문에 컴파일 오류가 발생할 가능성이 큽니다.

+0

잘 작동합니다. 귀하의 설명과 지원에 감사드립니다! –