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