View difference between Paste ID: 2xJbCjdd and eMM8yuWF
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")