Есть ли альтернатива scipy.optimize.lsq_linear для решения неквадратного матричного уравнения путем минимизации нормы L1? - PullRequest
1 голос
/ 11 апреля 2020

Я написал python код, который импортирует некоторые данные, которыми я затем манипулирую, чтобы получить неквадратную матрицу А. Затем я использовал следующий код для решения матричного уравнения.

from scipy.optimize import lsq_linear
X = lsq_linear(A_normalized, Y, bounds=(0, np.inf), method='bvls')

Как вы можете видеть Я использовал этот конкретный метод, потому что мне требуется, чтобы все X-коэффициенты были положительными. Однако я понял, что lsq_linear из scipy.optimize минимизирует L2-норму AX - Y для решения уравнения. Мне было интересно, знает ли кто-нибудь об альтернативе lsq_linear, которая решает уравнение, минимизируя вместо этого норму L1. Я заглянул в скучную документацию, но пока мне не повезло найти такую ​​альтернативу самому.

(Обратите внимание, что я на самом деле знаю, что такое Y, и что я пытаюсь выяснить, это X).

Редактировать: После попытки различных предложений из раздела комментариев и после большого разочарования мне наконец удалось чтобы заставить его работать, используя cvxpy. Однако с этим есть проблема. Прежде всего, элементы X должны быть положительными, но это не так. Более того, когда я умножаю матрицу A_normalized на X, они не равны Y. Мой код ниже. Буду очень признателен за любые предложения о том, что я могу сделать, чтобы это исправить. (Кстати, мое первоначальное использование lsq_linear в приведенном выше коде дало мне X, удовлетворяющий A_normalized * X = Y.)

import cvxpy as cp
from cvxpy.atoms import norm
import numpy as np

Y = specificity
x = cp.Variable(22)
objective = cp.Minimize(norm((A_normalized @ x - Y), 1))
constraints = [0 <= x]
prob = cp.Problem(objective, constraints)
result = prob.solve()
print("Optimal value", result)
print("Optimal var")
X = x.value #  A numpy ndarray.
print(X)
A_normalized @ X == Y
...