Python 使用scipy.linprog get ValueError解决L1回归问题:无法将输入数组从形状(20,1)广播到形状(20)

Python 使用scipy.linprog get ValueError解决L1回归问题:无法将输入数组从形状(20,1)广播到形状(20),python,numpy,scipy,linear-programming,Python,Numpy,Scipy,Linear Programming,我试图使用scipy.linprog解决L1回归问题,但出现了一个错误 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_fe

我试图使用scipy.linprog解决L1回归问题,但出现了一个错误

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|u dataset函数随机生成包含10个特征的10个样本的数据集,然后我尝试求解min | Ax-b |。这是一个使用线性规划求解最小绝对偏差回归的简单问题。但是出现了一个错误。 错误为
ValueError:无法将输入数组从形状(20,1)广播到形状(20)

我认为某个矩阵的维数一定有问题,但我无法找出它。

np替换
c
。压缩(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]

c
替换为
np。挤压(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]

错误发生在哪里?在
linprog
调用中?该函数的3个输入的
形状是什么?为什么
c
构造为(m+n,1)数组?为什么不<代码>(m+n)?考虑切换到其他的优化器。linprog不会带来太多的乐趣(你的正确示例只会因维度加倍而失败)。有更好的LP解算器,如GLPK、CBC和良好的建模工具,如cvxpy和纸浆。如果您的数据不会太大,也可以使用scipy.optimize.minimize和Cobyla或SLSQP。错误发生在哪里?在
linprog
调用中?该函数的3个输入的
形状是什么?为什么
c
构造为(m+n,1)数组?为什么不<代码>(m+n)?考虑切换到其他的优化器。linprog不会带来太多的乐趣(你的正确示例只会因维度加倍而失败)。有更好的LP解算器,如GLPK、CBC和良好的建模工具,如cvxpy和纸浆。如果您的数据没有那么大,也可以使用scipy.optimize.minimize和Cobyla或SLSQP。