2017-08-21 28 views
2

Scipy最小化を使用して、Std_Diff目的関数が最小であるd値(整数)を取得しようとしています。Scipy最小化関数

マイコード:RES =(Std_Diff、(1)、メソッド= 'SLSQP')を最小化する、私は別のエラーを取得:

を私は 境界を使用しない場合は

def Std_Diff(d): 
    return std(diff(df['BN'].values,d)); 

from scipy.optimize import minimize 
b=(3,) 
res = minimize(Std_Diff,(1,), method='SLSQP', bounds = b) 

The **df['BN'].values** are 
Out[72]: 
array([ 2, 2, 2, 2, 3, 2, 7, 5, 7, 11, 8, 2, 11, 7, 15, 8, 7, 
     12, 21, 19, 32, 35, 40, 35, 21, 19, 25, 20, 40, 80, 99], dtype=int64) 

Error is"IndexError: too many indices for array " 

> in _minimize_slsqp(func, x0, args, jac, bounds, constraints, maxiter, 
> ftol, iprint, disp, eps, callback, **unknown_options) 
>  368     fx = float(np.asarray(func(x))) 
>  369    except: 
> --> 370     raise ValueError("Objective function must return a scalar") 
>  371    # Compute the constraints 
>  372    if cons['eq']: ValueError: Objective function must return a scalar. 

ありがとうございます。

答えて

1

(私は開始時に周りのつまずきましたが、あなたがデバッグする方法のいくつかのアイデアを得ることができるので、私はここに残しておきます。)


あなたがしてminimizeを呼び出す:

Std_Diff,(1,) 

つまり、初期値はスカラー(または1の数)です。 minimizeはそれから手がかりをとり、検索変数を同じものに設定します。それはdで、あなたの関数に渡されます、Std_Diffです。しかし、関数が単一の値を返すことも期待しています。換言すれば、スカラー値のスカラー関数を最小化する。

したがってstd(diff(df['BN'].values,1))はスカラーを返す必要があります。明らかにそうではありません。想定さvalues

In [115]: bf 
Out[115]: 
array([ 2, 2, 2, 2, 3, 2, 7, 5, 7, 11, 8, 2, 11, 7, 15, 8, 7, 
     12, 21, 19, 32, 35, 40, 35, 21, 19, 25, 20, 40, 80, 99], dtype=int64) 
In [116]: np.std(np.diff(bf,1)) 
Out[116]: 9.9219733700285424 


OK、テストは、だから私の最初の推測は間違っています。


私はエラーがない後、あなたの関数で発生していることがわかり、エラー・スタックで、より慎重に探しています。それはdの使用に伴う問題のようです。無制限の場合

/usr/local/lib/python3.5/dist-packages/numpy/lib/function_base.py in diff(a, n, axis) 
    1913   raise ValueError(
-> 1914    "order must be non-negative but got " + repr(n)) 
    1915  a = asanyarray(a) 

ValueError: order must be non-negative but got array([-64259548.28233695]) 

、検索変数はnp.diffにエラーを上げ、(とてもそう)負行くことができます。

(あなたが表示され、エラーがDuring handling of the above exception, another exception occurred:からである。それは主エラーが、二次ではないのです。)


問題境界を指定し、仕様が不完全であることです。各変数に(最小、最大)タプルが必要です。だから、これは動作します:エラーラインで

In [147]: minimize(Std_Diff,1, method='SLSQP', bounds=((3,None),)) 
... 
Out[147]: 
    fun: 9.921973370028542 
    jac: array([ 64259549.28233695]) 
message: 'Positive directional derivative for linesearch' 
    nfev: 3 
    nit: 5 
    njev: 1 
    status: 8 
success: False 
     x: array([ 1.]) 

Bounds for variables (only for L-BFGS-B, TNC and SLSQP). (min, max) pairs for each element in x , defining the bounds on that parameter. Use None for one of min or max when there is no bound in that direction.

ルック:

--> 341   bnderr = bnds[:, 0] > bnds[:, 1] 

それはbndsが2列の2次元配列であることを期待します。たとえば:

In [153]: np.array(((3,10),)) 
Out[153]: array([[ 3, 10]]) 
In [154]: np.array((3,)) 
Out[154]: array([3]) 

私もその値が

def Std_Diff(d): 
    print(d) 
    r = np.std(np.diff(bf,d)) 
    print(r) 
    return r 
+0

ありがとうどのように変化したかの明確なアイデアを持っている機能を変更しました。出来た。 –

関連する問題