Я думаю, что путаница проистекает из неправильного умножения матриц в numpy
:
>>> A * optimal_x - y
array([[-0.57735027, -1. , -1. ],
[-1. , -0.57735027, -1. ],
[-1. , -1. , -0.57735027]])
Где на самом деле я думаю, что вы хотите
>>> np.dot(A, optimal_x) - y
array([-0.57735027, -0.57735027, -0.57735027])
Что на самом деле не нарушаетограничение (в пределах ошибок округления):
>>> np.linalg.norm(np.matmul(A, optimal_x) - y) ** 2
1.000000002699704
Также см. этот вопрос для ссылки на умножение матрицы на массив в numpy
.
Это действительно сбивает с толку, потому чтоCVXPY
объекты правильно обрабатывают оператор *
, даже с типами numpy:
>>> (A * x - y).value
array([-0.57735027, -0.57735027, -0.57735027])
Также обратите внимание, что для любого дерева выражений, которое вы строите в CVXPY
, после оптимизации вы можете запросить значениеэто выражение с учетом оптимизированного x
значения:
>>> cp.sum_squares(A*x - y).value
array(1.)