Есть ли способ реализовать выпуклую оптимизацию с использованием N-мерных массивов?

Учитывая данные с shape = (t,m,n), мне нужно найти векторную переменную формы (n,), которая минимизирует выпуклую функцию данных и вектора. Я использовал cvxopt (и cvxpy) для выполнения выпуклой оптимизации с использованием 2D-ввода, но похоже, что они не поддерживают 3D-массивы. Есть ли способ реализовать эту выпуклую оптимизацию с помощью этих или других подобных пакетов?

Учитывая данные с shape (t,m,n) и (t,m) и var с shape (n,), вот упрощение типа функции, которую мне нужно минимизировать:

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

Кажется, это должна быть простая выпуклая оптимизация, но, к сожалению, эти функции не поддерживаются в N-мерных массивах в cvxopt / cvxpy. Есть ли способ реализовать это?


person John    schedule 04.05.2019    source источник


Ответы (1)


Я думаю, если вы просто измените форму 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, ())
person Jacques Kvam    schedule 05.05.2019