Search code examples
pythonpython-3.xcvxpyconvex-optimizationcvxopt

Is there a way to implement convex optimization using N-dimensional arrays?


Given data with shape = (t,m,n), I need to find a vector variable of shape (n,) that minimizes a convex function of the data and vector. I've used cvxopt (and cvxpy) to perform convex optimizations using 2D input, but it seems like they don't support 3D arrays. Is there a way to implement this convex optimization using these or other similar packages?

Given data with shape (t,m,n) and (t,m) and var with shape (n,), here's a simplification of the type of function I need to minimize:

import numpy as np

obj_func(var,data1,data2):
    #data1.shape = (t,m,n)
    #data2.shape = (t,m)
    #var.shape = (n,)

    score = np.sum(data1*var,axis=2) #dot product along axis 2
    time_series = np.sum(score*data2,axis=1) #weighted sum along axis 1
    return np.sum(time_series)-np.sum(time_series**2) #some function

This seems like it should be a simple convex optimization, but unfortunately these functions aren't supported on N-dimensional arrays in cvxopt/cvxpy. Is there a way to implement this?


Solution

  • I think if you simply reshape data1 to be 2d temporarily you'll be fine, e.g.

    import numpy as np
    import cvxpy as cp
    t, m, n = 10, 8, 6
    data1 = np.ones((t, m, n))
    data2 = np.ones((t, m))
    x = cp.Variable(n)
    score = cp.reshape(data1.reshape(-1, n) * x, (t, m))
    time_series = cp.sum(cp.multiply(score, data2), axis=1)
    expr = cp.sum(time_series) - cp.sum(time_series ** 2)
    print(repr(expr))
    

    Outputs:

    Expression(CONCAVE, UNKNOWN, ())