Почему np.linalg.norm выдает здесь ошибку?

#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 этом .