convexjlr is an R package for
Disciplined Convex Programming (DCP) by providing a high level
wrapper for Julia package Convex.jl. The aim is
to provide optimization results rapidly and reliably in R
once you formulate your problem as a convex problem.
convexjlr can solve linear programs, second order cone
programs, semidefinite programs, exponential cone programs,
mixed-integer linear programs, and some other DCP-compliant convex
programs through Convex.jl.
convexjlr is on CRAN now! To use package
convexjlr, you first have to install Julia https://julialang.org/ on
your computer, and then you can install convexjlr just like
any other R packages.
Note: convexjlr used to support multiple ways to connect
to julia, one way was through package XRJulia
and the other way was to use package JuliaCall. The latter
approach was more performant and thus the default approach. But due to
the fact that XRJulia doesn’t support julia
v0.7 and v1.0 yet, only JuliaCall backend is supported
currently.
We hope you use convexjlr to solve your own problems. If
you would like to share your experience on using convexjlr
or have any questions about convexjlr, don’t hesitate to
contact me:
cxl508@psu.edu.
We will show a short example for convexjlr in solving
linear regression problem. To use package convexjlr, we
first need to attach it and do the initial setup:
library(convexjlr)
#>
#> Attaching package: 'convexjlr'
#> The following object is masked from 'package:base':
#>
#> norm
## If you wish to use JuliaCall backend for performance
convex_setup(backend = "JuliaCall")
#> Doing initialization. It may take some time. Please wait.
#> Julia version 1.0.2 at location /Applications/Julia-1.0.app/Contents/Resources/julia/bin will be used.
#> Loading setup script for JuliaCall...
#> Finish loading setup script for JuliaCall.
#> [1] TRUEAnd this is our linear regression function using
convexjlr:
linear_regression <- function(x, y){
p <- ncol(x)
## n is a scalar, you don't have to use J(.) to send it to Julia.
n <- nrow(x) ## n <- J(nrow(x))
## x is a matrix and y is a vector, you have to use J(.) to send them to Julia.
x <- J(x)
y <- J(y)
## coefficient vector beta and intercept b.
beta <- Variable(p)
b <- Variable()
## MSE is mean square error.
MSE <- Expr(sumsquares(y - x %*% beta - b) / n)
## In linear regression, we want to minimize MSE.
p1 <- minimize(MSE)
cvx_optim(p1)
list(coef = value(beta), intercept = value(b))
}In the function, x is the predictor matrix,
y is the response we have. And the
linear_regression function will return the coefficient and
intercept solved by cvx_optim.
Now we can see a little example using the
linear_regression function we have just built.
n <- 1000
p <- 5
## Sigma, the covariance matrix of x, is of AR-1 strcture.
Sigma <- outer(1:p, 1:p, function(i, j) 0.5 ^ abs(i - j))
x <- matrix(rnorm(n * p), n, p) %*% chol(Sigma)
## The real coefficient is all zero except the first, second and fourth elements.
beta0 <- c(5, 1, 0, 2, 0)
y <- x %*% beta0 + 0.2 * rnorm(n)
linear_regression(x, y)$coef
#> [,1]
#> [1,] 5.003248799
#> [2,] 0.991593361
#> [3,] -0.013118929
#> [4,] 2.008255127
#> [5,] 0.004305963More examples (including using convexjlr for Lasso,
logistic regression and Support Vector Machine) can be found in the
pakage vignette or on the github page: https://github.com/Non-Contradiction/convexjlr