Вопрос или проблема
Следующий код ошибки был сгенерирован при запуске lasso.py. Может кто-нибудь помочь в исправлении этой ошибки?
Вот код:
from cvxpy import *
import numpy as np
import cvxopt
from multiprocessing import Pool
# Данные задачи.
n = 10
m = 5
A = cvxopt.normal(n,m)
b = cvxopt.normal(n)
gamma = Parameter(nonneg=True)
# Построение задачи.
x = Variable(m)
objective = Minimize(sum_squares(A*x - b) + gamma*norm(x, 1))
p = Problem(objective)
# Присвоение значения gamma и нахождение оптимального x.
def get_x(gamma_value):
gamma.value = gamma_value
result = p.solve()
return x.value
gammas = np.logspace(-1, 2, num=100)
# Серийные вычисления.
x_values = [get_x(value) for value in gammas]
# Параллельные вычисления.
pool = Pool(processes = 4)
par_x = pool.map(get_x, gammas)
for v1,v2 in zip(x_values, par_x):
if np.linalg.norm(v1 - v2) > 1e-5:
print("ошибка")
Ошибка: во время выполнения
Traceback (most recent call last):
File "lasso.py", line 31, in
objective = Minimize(sum_squares(A*x - b) + gamma*norm(x, 1))
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/expressions/expression.py", line 45, in cast_op
return binary_op(self, other)
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/expressions/expression.py", line 435, in __sub__
return self + -other
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/expressions/expression.py", line 45, in cast_op
return binary_op(self, other)
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/expressions/expression.py", line 423, in __add__
return cvxtypes.add_expr()([self, other])
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/atoms/affine/add_expr.py", line 33, in __init__
super(AddExpression, self).__init__(*arg_groups)
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/atoms/atom.py", line 41, in __init__
self._shape = self.shape_from_args()
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/atoms/affine/add_expr.py", line 41, in shape_from_args
return u.shape.sum_shapes([arg.shape for arg in self.args])
File "/usr/local/lib/python3.5/dist-packages/cvxpy-1.0.11-py3.5-linux-x86_64.egg/cvxpy/utilities/shape.py", line 49, in sum_shapes
len(shapes)*" %s" % tuple(shapes))
ValueError: Cannot broadcast dimensions (10,) (10, 1)
Как показывают многочисленные ссылки, я попробовал все возможные версии python и библиотек. Но я не смог это исправить. Пожалуйста, дайте какие-либо рекомендации.
(A*x) выражение имеет размерность (10, ) и b имеет размер (10, 1) – вот почему вы видите эту ошибку.
Мое исправление решает ошибку, но вам следует еще раз проверить результаты.
objective = Minimize(sum_squares(A*x - np.array(b).reshape(10,)) + gamma*norm(x, 1))
Надеюсь, это поможет!
Исправление вашей проблемы будет заключаться в изменении строки
x = Variable(m)
на
x = Variable(shape=(m,1))
Ответ или решение
Чтобы решить возникшую у вас ошибку при выполнении скрипта lasso.py
, необходимо обратить внимание на размерности переменных, участвующих в вашем уравнении. Ошибка, которую вы встретили, связана с тем, что вектор, создаваемый при умножении матрицы A
на переменную x
, имеет размерность (10,)
, в то время как вектор b
имеет размерность (10, 1)
. Это несоответствие размерностей является причиной ошибки при выполнении операции вычитания.
Для исправления ошибки вы можете внести несколько изменений в код. Вот предложенный вами исправленный вариант:
from cvxpy import *
import numpy as np
import cvxopt
from multiprocessing import Pool
# Данные для задачи.
n = 10
m = 5
A = cvxopt.normal(n, m)
b = cvxopt.normal(n)
gamma = Parameter(nonneg=True)
# Конструкция задачи.
x = Variable(shape=(m, 1)) # Изменено на матрицу столбец
objective = Minimize(sum_squares(A @ x - np.array(b).reshape(n,)) + gamma * norm(x, 1))
p = Problem(objective)
# Присвоение значения gamma и нахождение оптимального x.
def get_x(gamma_value):
gamma.value = gamma_value
result = p.solve()
return x.value
gammas = np.logspace(-1, 2, num=100)
# Серийные вычисления.
x_values = [get_x(value) for value in gammas]
# Параллельные вычисления.
pool = Pool(processes=4)
par_x = pool.map(get_x, gammas)
for v1, v2 in zip(x_values, par_x):
if np.linalg.norm(v1 - v2) > 1e-5:
print("error")
Ключевые изменения:
-
Изменена строка, определяющая переменную
x
, наVariable(shape=(m, 1))
, чтобы она была вектором столбца. Это приведет к тому, что результаты умноженияA @ x
иx
будут совместимыми по размерностям. -
Убедитесь, что
b
правильно преобразован в одномерный массив с помощьюnp.array(b).reshape(n,)
, чтобы соответствовать размерности(10,)
, что сделает их совместимыми для операций.
Эти изменения должны помочь устранить ошибку, с которой вы столкнулись. Тщательно протестируйте результаты, чтобы убедиться, что они соответствуют вашим ожиданиям. Если возникнут дополнительные вопросы, не стесняйтесь обратиться за помощью.