Guest User

KernelMatrix

a guest
Jul 1st, 2014
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. library(kernlab)
  2. N = 10000
  3. p = 5
  4. b = 1000
  5. X = matrix(rnorm(N*p), ncol = p)
  6. center = X[sample(1:N, b),]
  7. sigma = 1
  8. kernel_X <- kernelMatrix(rbfdot(sigma=1/(2*sigma^2)), X, center)
  9.  
  10. library(Rcpp)
  11. library(RcppArmadillo)
  12.  
  13. sourceCpp(code = '
  14. // [[Rcpp::depends(RcppArmadillo)]]
  15. #include <RcppArmadillo.h>
  16. #include <omp.h>
  17. using namespace Rcpp;
  18. using namespace arma;
  19. // [[Rcpp::export]]
  20.  
  21. NumericMatrix kernelMatrix_cpp(NumericMatrix Xr, NumericMatrix Centerr, double sigma) {
  22.     omp_set_num_threads(omp_get_max_threads());
  23.     uword n = Xr.nrow(), b = Centerr.nrow(), row_index, col_index;
  24.     mat X(Xr.begin(), n, Xr.ncol(), false);
  25.     mat Center(Centerr.begin(), b, Centerr.ncol(), false);
  26.     mat KerX(n, b);
  27.     #pragma omp parallel private(row_index, col_index)
  28.     for (row_index = 0; row_index < n; row_index++)
  29.     {
  30.         #pragma omp for nowait
  31.         for (col_index = 0; col_index < b; col_index++)
  32.         {
  33.             KerX(row_index, col_index) = exp(sum(square(X.row(row_index) - Center.row(col_index))) / (-2.0 * sigma * sigma));
  34.         }
  35.     }
  36.    return wrap(KerX);
  37. }')
  38. kernel_X_cpp = kernelMatrix_cpp(X, center, sigma)
  39. all.equal(kernel_X@.Data, kernel_X_cpp)
  40. sum(abs(kernel_X@.Data - kernel_X_cpp) < 1e-12)
  41.  
  42. library(rbenchmark)
  43. benchmark(kernelMatrix_cpp(X, center, sigma), kernelMatrix(rbfdot(sigma=1/(2*sigma^2)), X, center), columns=c("test", "replications","elapsed", "relative"), replications=50, order="relative")
Advertisement
Add Comment
Please, Sign In to add comment