Learn R Programming

Convex Optimization in R by convexjlr

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.

Installation

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.

Quick Example

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] TRUE

And 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.004305963

More Examples

More 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

Copy Link

Version

Install

install.packages('convexjlr')

Monthly Downloads

41

Version

0.8.1

License

Apache License | file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Changcheng Li

Last Published

December 16th, 2018

Functions in convexjlr (0.8.1)

lambdamax

Largest eigenvalues of x
convex_setup

Doing the setup for the package convexjlr
logisticloss

log(1 + exp(x))
square

Square of x
sumlargest

Sum of the largest elements
maximum

Largest elements
pos

Positive parts
minimum

Smallest elements
problem_creating

Create optimization problem
variable_creating

Create variable for optimization problem
vec

Vector representation
logsumexp

log(sum(exp(x)))
lambdamin

Smallest eigenvalues of x
matrixfrac

x^T P^-1 x
nuclearnorm

Sum of singular values of x
sumsmallest

Sum of the smallest elements
value

Get values of expressions at optimizer
tr

Trace of matrix
sumsquares

Sum of squares of x
huber

Huber loss
neg

Negative parts
norm

p-norm of x
property

Get properties of optimization problem
quadform

x^T P x
operatornorm

Largest singular value of x
vecdot

Inner product of vector representation of two matrices
vecnorm

p-norm of vector representation of x
addConstraint

Add constraints to optimization problem
cvx_optim

Solve optimization problem
geomean

Geometric mean of x and y
dot

Inner product
logdet

Log of determinant of x
dotsort

Inner product of two vectors after sorted
entropy

sum(-x * log(x))
Expr

Create expressions to be used for optimization problem creation
J

Make a variable to be of Julia's awareness