2016-10-27 6 views
0

Я пытаюсь решить регрессию 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). Я думаю, что должно быть что-то не так с размером некоторой матрицы, но я не могу понять это.

+0

Где происходит ошибка? В вызове 'linprog'? Что такое «форма» трех входов этой функции? – hpaulj

+0

Почему 'c' построен как массив (m + n, 1)? Почему бы не '(m + n,)'? – hpaulj

+0

Рассмотрите возможность переключения на другой оптимизатор. linprog не принесет большой радости (ваш исправленный пример не удастся удвоить размеры). Есть намного лучшие LP-решатели, такие как GLPK, CBC и хорошие инструменты моделирования, такие как cvxpy и pulp. Также возможно использовать scipy.optimize.minimize с Cobyla или SLSQP, если ваши данные не будут такими огромными. – sascha

ответ

2

Заменить c с np.squeeze(c) в следующей строке:

res = linprog(c, A_ub=A_, b_ub=b_) 

результат:

status: 0 
    slack: array([ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 1.74947071e-15, 8.81121786e-15, 
     3.08534221e+01, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     0.00000000e+00, 0.00000000e+00]) 
success: True 
    fun: 15.426711070042149 
     x: array([ 4.17175117e+01, 3.70399683e+01, 6.20756253e+01, 
     3.77095189e+01, 7.52937664e+01, 6.83052169e+01, 
     2.99644354e+01, 0.00000000e+00, 4.16154976e+00, 
     1.57578313e+01, 0.00000000e+00, 1.45010519e-32, 
     0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 
     1.04491091e-15, 1.77635684e-15, 5.78946776e-16, 
     0.00000000e+00, 1.54267111e+01]) 
message: 'Optimization terminated successfully.' 
    nit: 19 
[ 42.38550486 42.87687009 66.01735375 29.8282326 60.63932141 
    61.8015429 30.15748167 1.91931983 13.54740642 29.00776072]