SHOW:
|
|
- or go back to the newest paste.
| 1 | library(kernlab) | |
| 2 | N = 10000 | |
| 3 | - | sourceCpp(code = '#include <Rcpp.h> |
| 3 | + | p = 5 |
| 4 | b = 1000 | |
| 5 | X = matrix(rnorm(N*p), ncol = p) | |
| 6 | center = X[sample(1:N, b),] | |
| 7 | - | DataFrame mypnorm(NumericVector x){
|
| 7 | + | sigma = 1 |
| 8 | - | int n = x.size(); |
| 8 | + | kernel_X <- kernelMatrix(rbfdot(sigma=1/(2*sigma^2)), X, center) |
| 9 | - | NumericVector y1(n), y2(n), y3(n); |
| 9 | + | |
| 10 | - | |
| 10 | + | library(Rcpp) |
| 11 | - | for (int i=0; i<n; i++){
|
| 11 | + | library(RcppArmadillo) |
| 12 | - | y1[i] = ::Rf_pnorm5(x[i], 0.0, 1.0, 1, 0); |
| 12 | + | |
| 13 | - | y2[i] = R::pnorm(x[i], 0.0, 1.0, 1, 0); |
| 13 | + | |
| 14 | // [[Rcpp::depends(RcppArmadillo)]] | |
| 15 | - | y3 = pnorm(x); |
| 15 | + | |
| 16 | - | return DataFrame::create(Named("R") = y1,
|
| 16 | + | #include <omp.h> |
| 17 | - | Named("Rf_") = y2,
|
| 17 | + | |
| 18 | - | Named("sugar") = y3);
|
| 18 | + | using namespace arma; |
| 19 | // [[Rcpp::export]] | |
| 20 | - | mypnorm(runif(10, -3, 3)) |
| 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 | - | List fastLm(NumericVector yr, NumericMatrix Xr) {
|
| 28 | + | for (row_index = 0; row_index < n; row_index++) |
| 29 | - | int n = Xr.nrow(), k = Xr.ncol(); |
| 29 | + | {
|
| 30 | - | arma::mat X(Xr.begin(), n, k, false); |
| 30 | + | #pragma omp for nowait |
| 31 | - | arma::colvec y(yr.begin(), yr.size(), false); |
| 31 | + | for (col_index = 0; col_index < b; col_index++) |
| 32 | - | arma::colvec coef = arma::solve(X, y); |
| 32 | + | {
|
| 33 | - | arma::colvec resid = y - X*coef; |
| 33 | + | KerX(row_index, col_index) = exp(sum(square(X.row(row_index) - Center.row(col_index))) / (-2.0 * sigma * sigma)); |
| 34 | - | double sig2 = arma::as_scalar(arma::trans(resid)*resid/(n-k)); |
| 34 | + | } |
| 35 | - | arma::colvec stderrest = arma::sqrt(sig2 * arma::diagvec( arma::inv(arma::trans(X)*X)) ); |
| 35 | + | |
| 36 | - | return List::create(Named("coefficients") = coef,
|
| 36 | + | return wrap(KerX); |
| 37 | - | Named("stderr") = stderrest);
|
| 37 | + | |
| 38 | kernel_X_cpp = kernelMatrix_cpp(X, center, sigma) | |
| 39 | - | X = matrix(rnorm(100*2), ncol = 2) |
| 39 | + | all.equal([email protected], kernel_X_cpp) |
| 40 | - | y = 0.5 + X %*% c(0.3, -0.7) + rnorm(100) |
| 40 | + | sum(abs([email protected] - kernel_X_cpp) < 1e-12) |
| 41 | - | fastLm(y, X) |
| 41 | + | |
| 42 | library(rbenchmark) | |
| 43 | - | sourceCpp(code = '// [[Rcpp::depends(RcppEigen)]] |
| 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") |