Квадратичная форма (quad_form) над выражениями в CVXPY

Я строю термин риска в задаче квадратичной оптимизации (QP), используя CVXPY, и я изо всех сил пытаюсь объединить выражения с ковариационной матрицей, используя quad_form.

from cvxpy import Variable, quad_form
from numpy import identity
from pandas import Series, DataFrame

assets = ['AAA', 'BBB', 'CCC', 'DDD']
optimal = Series(1 / 4, assets)
covariances = DataFrame(identity(4) * 0.20, index=assets, columns=assets)
covariances.iloc[2, 3] += 0.01
covariances.iloc[3, 2] = covariances.iloc[2, 3]

target = Series([Variable(name=asset) for asset in assets], index=assets)
difference = target - optimal

active_variance = quad_form(difference.values, covariances.values)

Я получаю следующую ошибку:

ValueError: setting an array element with a sequence.

Я могу просто сделать расчет в пандах, но тогда CVXPY не знает, что выражение выпукло.

active_variance = difference.T.dot(covariances).dot(difference)
print(active_variance.curvature)

Эта проблема связана с моим предыдущий вопрос с docplex, хотя решение здесь не работает, поскольку docplex не требует, чтобы проблема была выпуклой, но CVXPY требует. Есть ли правильная форма в CVXPY?


person rhaskett    schedule 30.01.2021    source источник
comment
Использование quad_form здесь имеет смысл только в том случае, если difference будет вектором переменных решения (или констант). Из-за того, что вы используете панды (я не уверен, намеренно это или нет) здесь, difference становится нечисловым / dtype=object, который никогда не может использоваться в cvxpy. Подсказка: AAA + -0.25. В общем, я бы не рекомендовал смешивать pandas и cvxpy, не зная толком обо всех внутренностях: скрытых приведениях и прочем.   -  person sascha    schedule 31.01.2021
comment
Хорошо, это немного грустно, потому что большая оптимизация довольно сложна без Pandas, отслеживающего выравнивание данных, но, похоже, это то, что требуется. Спасибо.   -  person rhaskett    schedule 31.01.2021