Как сказать cvxpy, как суммировать значения матрицы в целевой функции? - PullRequest
0 голосов
/ 18 декабря 2018

Я хочу реализовать эту проблему оптимизации из этой статьи , используя cvxpy или любую аналогичную библиотеку.Проблема, с которой я сталкиваюсь, заключается в том, как мне это кодировать, чтобы это было понятно для cvxpy.

Objective function

from cvxpy import *
g = Variable(n)
eta = Variable(n)
loss = sum(g+g-(2*g)+eta-(d**2))
reg = norm(eta, 1)
lambd = Parameter(nonneg=True)
prob = Problem(Minimize(lambd*reg+0.5*loss))

Я знаю, что мое определение потери очевиднонеправильно, я просто должен был что-то добавить, чтобы проиллюстрировать мою проблему.Я не знаю, как сказать cvxpy обрабатывать индексы матриц так, как я хочу.Это возможно даже в cvxpy?Есть ли другая библиотека, которая могла бы сделать это легко?Любой пример кода будет с благодарностью.

1 Ответ

0 голосов
/ 23 декабря 2018

Вы можете построить функцию стоимости в цикле.Также кажется, что g должен быть положительным полуопределенным, поэтому я добавил PSD=True.Вот полный пример:

from cvxpy import *
n = 10
g = Variable((n, n), PSD=True)
eta = Variable((n, n))
reg = norm(eta, 1)
d = np.ones((n, n))
lamb = 1.

cost = 0
for i in range(n):
    for j in range(n):
        cost += (g[i, i] + g[j, j] - 2 * g[i, j] + eta[i, j] - d[i, j]**2) ** 2

cost = 0.5 * cost + lamb * reg
prob = Problem(Minimize(cost))
prob.solve()
...