有没有办法使用N维数组实现凸优化?

时间:2019-05-04 18:38:47

标签: python python-3.x cvxpy convex-optimization cvxopt

给定shape = (t,m,n)的数据,我需要找到一个形状为(n,)的矢量变量,该变量将数据和矢量的凸函数最小化。我已经使用cvxopt(和cvxpy)来使用2D输入执行凸优化,但是似乎它们不支持3D数组。有没有办法使用这些或其他类似的程序包来实现这种凸优化?

给出形状为(t,m,n)(t,m)的数据以及形状为(n,)的var,这是我需要最小化的函数类型的简化:

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

这似乎应该是一个简单的凸优化,但是不幸的是,cvxopt / cvxpy中的N维数组不支持这些函数。有办法实现吗?

1 个答案:

答案 0 :(得分:0)

我认为,如果您只是将data1的形状暂时改成2d,就可以了,例如

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

输出:

Expression(CONCAVE, UNKNOWN, ())