2016-10-27 5 views
0

scipy.linprogを使用してL1回帰を解くことを試みていますが、 | AX-B |scipy.linprogを使用してL1回帰を解く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個のサンプルのデータセットを生成し、その後、私は分を解決しよう。これは、線形計画法を用いて絶対偏差回帰を最小にするという単純な問題である。しかし、エラーが発生します。 エラーはValueError: could not broadcast input array from shape (20,1) into shape (20)です。 私はいくつかの行列の次元に何か間違っている必要がありますが、私はそれを把握することはできないと思う。

+0

を? 'linprog'呼び出しでは?その関数への3つの入力のうちの「形状」は何ですか? – hpaulj

+0

なぜ 'c'は(m + n、1)配列として構成されていますか?なぜ(m + n、)ではないのですか? – hpaulj

+0

他のオプティマイザに切り替えることを検討してください。 linprogは多くの喜びをもたらさないでしょう(あなたの訂正された例は倍増した次元では失敗します)。 GLPK、CBC、cvxpyやパルプのような優れたモデリングツールのようなLPソルバーははるかに優れています。あなたのデータがそれほど大きくない場合は、CobylaまたはSLSQPでscipy.optimize.minimizeを使用することもできます。 – sascha

答えて

2

は、次の行でnp.squeeze(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] 
関連する問題