#python #python-3.x #numpy #cvxpy
Вопрос:
Я пытаюсь решить классическую задачу наименьших квадратов с помощью cvxpy, но получаю ошибку из-за np.linalg.norm
. Любая помощь была бы безмерно признательна.
Мой код приведен ниже. Как бы то ни было, это работает. Однако, если я изменюсь cp.sum_squares
на np.linalg.norm
, это не сработает (выдувается сообщение об ошибке).
import cvxpy as cp
import numpy as np
def main(n):
# Create the data for the least squares problem
A = np.random.rand(n, n-1)
b = np.random.rand(n)
# Introduce the variables
x = cp.Variable(n-1)
# Introduce the constraints (no constraints)
constraints = []
# Introduce the objective function
obj = cp.Minimize(cp.sum_squares(A @ x - b))
prob = cp.Problem(obj, constraints)
prob.solve()
main(4)
Сообщение об ошибке:
"C:UsersOviDesktopPython FilesvenvScriptspython.exe" "C:/Users/Ovi/Desktop/Python Files/Solving Least Squares.py"
C:UsersOviDesktopPython Filesvenvlibsite-packagescvxpyexpressionsexpression.py:556: UserWarning:
This use of ``*`` has resulted in matrix multiplication.
Using ``*`` for matrix multiplication has been deprecated since CVXPY 1.1.
Use ``*`` for matrix-scalar and vector-scalar multiplication.
Use ``@`` for matrix-matrix and matrix-vector multiplication.
Use ``multiply`` for elementwise multiplication.
This code path has been hit 1 times so far.
warnings.warn(msg, UserWarning)
AttributeError: 'MulExpression' object has no attribute 'sqrt'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:UsersOviDesktopPython FilesSolving Least Squares.py", line 22, in <module>
main(4)
File "C:UsersOviDesktopPython FilesSolving Least Squares.py", line 17, in main
obj = cp.Minimize(np.linalg.norm(A @ x - b))
File "<__array_function__ internals>", line 5, in norm
File "C:UsersOviAppDataLocalProgramsPythonPython39libsite-packagesnumpylinalglinalg.py", line 2530, in norm
ret = sqrt(sqnorm)
TypeError: loop of ufunc does not support argument 0 of type MulExpression which has no callable sqrt method
Process finished with exit code 1
Комментарии:
1. Ну и почему это должно сработать?
np.linalg.norm
не реализует методы, вызываемые внутренне CVXPY, поэтому для этого нет причин. Всегда используйте функции cvxpy в своих целях или базовые переопределенные операции, такие как , *, @ и т. Д.2. @Literal Поскольку cvxpy совместим с numpy, я подумал, что мы могли бы поместить любые функции numpy в cp.Minimize( ). Мне даже в голову не приходило, что это невозможно. Но теперь я знаю лучше, большое вам спасибо!
3.
np.linalg.norm
это код Python, который вы можете прочитать. Сначала это делаетсяx = asarray(x)
, пытаясь превратить аргумент в вашем случаеA@x-b
в числовой массив numpy. Тогда это происходитnp.sqrt(np.dot(x,x))
. Я ничего не знаю обcvxpy
этом , но я подозреваюcp.Variable
, что создает аMulExpression
, которое не может быть оценено таким образом.4. @hpaulj, если я вас правильно понял,
cvxpy
преобразуетсяA@x-b
в формат, с которымnp.linalg.norm()
невозможно работать. Но поскольку функция numpy-это первое , что нужно сделатьA@x-b
, не следует ли ей предпринять какие-либо действия, преждеcvxpy
чем у нее появится шанс что-либо сделать?5. Я не думаю, что дело даже доходит до
cp.Minimize
этого . Проблема в том, чтобы передатьA@x-b
norm
кому . На что этоA@x-b
даже похоже, еще лучшеnp.asarray(A@x-b)
. Я видел подобные проблемы, когда люди пытаются использоватьsympy
выражения вnumpy
функциях.numpy
ничего «не знает» обcvxpy
этом .