带有Rcpp的套索解决方案:自我研究

时间:2018-07-24 18:51:20

标签: r rcpp armadillo

我是Rcpp的新手。我正在尝试为Rcpp中的套索编写坐标下降算法,作为一个自学课程。代码返回错误:

Mat::init(): requested size is not compatible with column vector layout

编写代码时我也遇到了一些问题。

  1. 没有用于调用“签名”的匹配功能
  2. 没有匹配函数可调用“ ifelse”
  3. pow(X.col(j),2):没有可行的转换

我写

  • (S1>0)-(S1<0)用于(1),以计算S1的符号,

  • if(){}else{}语句,用于(2)和

  • X.col(j)%X.col(j) for(3)。

有什么建议吗?

这是代码。

// [[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;
}

R中,我用

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))

0 个答案:

没有答案