Я пытаюсь решить регрессию L1 с помощью scipy.linprog, но получить ошибку.Решите регрессию L1 с помощью scipy.linprog get ValueError: не удалось передать массив ввода из формы (20,1) в форму (20)
import numpy as np
from sklearn import datasets
from scipy.optimize import linprog
def generate_dataset(n, d):
A, b, coef = datasets.make_regression(n_samples=n,
n_features=d,
n_informative=d,
noise=10,
coef=True,
random_state=0)
return A, b, coef
def solver(A, b):
n = len(A)
m = len(A[0])
c = np.vstack((np.zeros((m, 1)), np.ones((n, 1))))
A_ = np.vstack((np.hstack((A, -np.eye(n))), np.hstack((-A, -np.eye(n)))))
b_ = np.vstack((b, -b))
res = linprog(c, A_ub=A_, b_ub=b_)
return res
A, b, coef = generate_dataset(10, 10)
res = solver(A, b)
print(res)
print(coef)
Функция generate_dataset случайным образом набор данных из 10 образцов с 10 функциями, то я пытаюсь решить мин | Ax-б |. Это простая проблема решения регрессии наименьшего абсолютного отклонения с использованием линейного программирования. Но возникает ошибка. Ошибка ValueError: could not broadcast input array from shape (20,1) into shape (20)
. Я думаю, что должно быть что-то не так с размером некоторой матрицы, но я не могу понять это.
Где происходит ошибка? В вызове 'linprog'? Что такое «форма» трех входов этой функции? – hpaulj
Почему 'c' построен как массив (m + n, 1)? Почему бы не '(m + n,)'? – hpaulj
Рассмотрите возможность переключения на другой оптимизатор. linprog не принесет большой радости (ваш исправленный пример не удастся удвоить размеры). Есть намного лучшие LP-решатели, такие как GLPK, CBC и хорошие инструменты моделирования, такие как cvxpy и pulp. Также возможно использовать scipy.optimize.minimize с Cobyla или SLSQP, если ваши данные не будут такими огромными. – sascha