Rcpp套索解:一个自我研究
我是Rcpp的新手。我正在尝试为Rcpp中的lasso编写一个坐标下降算法,作为一个自学。该代码返回一个错误:Rcpp套索解:一个自我研究,r,rcpp,armadillo,R,Rcpp,Armadillo,我是Rcpp的新手。我正在尝试为Rcpp中的lasso编写一个坐标下降算法,作为一个自学。该代码返回一个错误: Mat::init(): requested size is not compatible with column vector layout 我在编写代码时也遇到了一些问题 对“sign”的调用没有匹配的函数 调用“ifelse”时没有匹配的函数 pow(X.col(j),2):没有可行的转换 我写 (S1>0)-(S1如何调用代码?@coatless调用sourceCpp(“f
Mat::init(): requested size is not compatible with column vector layout
我在编写代码时也遇到了一些问题
(S1>0)-(S1如何调用代码?@coatless调用
。然后sourceCpp(“filename.cpp”)
在系数=betamat(X,y,seq(0,1,0.05))
中。这里R
是一个矩阵,X
是一个向量。从代码大小的三分之一开始,一个接一个地消除警告。然后一行一行地添加代码。这里有免费午餐(TM)。“调试工作也有。oops.错过了必要的否,因为”这里(当然)没有免费午餐(TM)”.Armadillo确实支持y
,c.f?符号
// [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadillo.h> using namespace Rcpp; using namespace arma; // [[Rcpp::export]] mat betamat(NumericMatrix Xr, NumericVector yr, NumericVector lambdar, double tol=0.0000001) { int N = Xr.nrow(), p = Xr.ncol(), l = lambdar.size(); mat X(Xr.begin(), N, p, false); colvec y(yr.begin(), yr.size(), false); vec lambda(lambdar.begin(), lambdar.size(),false); colvec ols = solve(X,y); mat betas = zeros<mat>(p,l); // bool converged = false; for (int i = 0; i < l; ++i) { colvec b = zeros<vec>(p); colvec r = y-X*b; while(converged == false){ colvec beta_old = betas; for(int j = 0; j < p; ++j){ r = r + X.col(j)*b(j); double xr = dot(X.col(j),r); double S1 = xr/N; double xx = sum(X.col(j)%X.col(j))/N; b(j) =((S1>0)-(S1<0))*(abs(S1)-lambda(i))/xx; if(b(j)>0){ b(j)=b(j); }else{ b(j)=0; } r = r - X.col(j)*b(j); } converged = (sum(abs(betas - beta_old)) < tol); } betas.col(i) = b; } return betas; }
library(Rcpp) sourceCpp("filename.cpp") set.seed(1) X <- matrix(rnorm(100*3),100) y <- rnorm(100) coefficients <- betamat(X,y,seq(0,1,0.0005))