Есть ли способ реализовать выпуклую оптимизацию с использованием N-мерных массивов? - PullRequest
0 голосов
/ 04 мая 2019

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

Учитывая данные с формой (t,m,n) и (t,m) и переменной с формой (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. Есть ли способ реализовать это?

1 Ответ

0 голосов
/ 05 мая 2019

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