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

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

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. Я просмотрел документацию по scipy, но пока мне не удалось найти такую ​​альтернативу.

(Обратите внимание, что я действительно знаю, что такое 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

person YKZ    schedule 11.04.2020    source источник
comment
Вы решили матричные уравнения? Вы можете просто реализовать их вручную.   -  person Mad Physicist    schedule 11.04.2020
comment
Возможно, вам придется собрать это самостоятельно: с ограничениями равенства в python%23comment86602743_49787068">stackoverflow.com/questions/49787068/   -  person Joe    schedule 11.04.2020
comment
stackoverflow.com/questions/58584127/   -  person Joe    schedule 11.04.2020
comment
Вы можете попробовать этот набор инструментов cvxopt.org/examples/mlbook/l1.html, но я никогда не использовал его.   -  person Joe    schedule 11.04.2020
comment
Одним из решений может быть просто поместить return np.sum(np.dot(A_normalized, X) - Y) в функцию и обернуть ее в scipy.optimize.minimize.   -  person Joe    schedule 11.04.2020
comment
Из приведенных выше рекомендаций: (пользовательские l1) cvxopt-решатели не поддерживают границы переменных, как это требуется, и подход scipy.minimize приведет к негладкой проблеме для некоторого решателя, предполагающего гладкость. Поиск правильного подхода во многом зависит от варианта использования (например, задача. размер), но cvxpy и его доступные решатели (ecos для высокоточных малых масштабов, scs для низкоточных и средних масштабов), вероятно, являются самым простым подходом. чтобы получить что-то, что работает в нескольких строках кода (код, указанный выше, может быть сильно минимизирован, поскольку cvxpy поддерживает norm(x,1)-переформулировку из коробки.   -  person sascha    schedule 11.04.2020
comment
После попытки cvxpy вроде работает, но не совсем. Смотрите редактирование, которое я сделал выше, для более подробной информации.   -  person YKZ    schedule 12.04.2020
comment
Подробности? Я ничего не вижу и не буду запускать ваш код. Так что мне нужно догадаться, поскольку вам не хватает этих деталей. Ваша проблема — это проблема, для которой не существует решения в закрытой форме, и потребуются итеративные подходы. Эти итерационные подходы приближаются/сходятся к оптимуму. Они (теоретически) эффективны (поли) и могут быть сделаны сколь угодно точными. На практике есть ограничение, и вы увидите, что ваше >=0 нарушается чем-то вроде 10^-8. Незначительный. Ваша проверка мат-мул также будет иметь аналогичные нарушения. Это нормально и (на практике) будет всегда.   -  person sascha    schedule 12.04.2020
comment
Всем, кто пишет A_normalized @ X == Y со значениями с плавающей запятой, особенно в (незакрытой форме) численной оптимизации, действительно следует читать: What Every Computer Scientist Should Know About. Floating-Point Arithmetic. Подсказка: np.isclose().   -  person sascha    schedule 12.04.2020