ошибка при выполнении lasso.py

Вопрос или проблема

Следующий код ошибки был сгенерирован при запуске 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")

Ключевые изменения:

  1. Изменена строка, определяющая переменную x, на Variable(shape=(m, 1)), чтобы она была вектором столбца. Это приведет к тому, что результаты умножения A @ x и x будут совместимыми по размерностям.

  2. Убедитесь, что b правильно преобразован в одномерный массив с помощью np.array(b).reshape(n,), чтобы соответствовать размерности (10,), что сделает их совместимыми для операций.

Эти изменения должны помочь устранить ошибку, с которой вы столкнулись. Тщательно протестируйте результаты, чтобы убедиться, что они соответствуют вашим ожиданиям. Если возникнут дополнительные вопросы, не стесняйтесь обратиться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...