2016-11-17 8 views
1

を持っていない私はscipyのダウンロードと線形関数を最適化しています、はAttributeError:「フロート」オブジェクトが属性「勾配」scipyのダウンロードパイソン

def func(weights): 
     var = ['x1', 'x2', 'x3', 'x4'] 
     if weights is None: 
      weights = np.ones(len(var))/len(var) 
     return len(set([var[i] for i in range(len(weights)) if weights[i]>0]))/len(var) 

res = minimize(lambda x: func(x), x0=[0.25,0.25,0.25,0.25],method='SLSQP', 
         jac=ad.gh(lambda x: func(x))[0], bounds=((0.,1.),)*4, 
         options = {'disp':True, 'ftol': 1e-20, 'maxiter': 1000}, 
         constraints= {'type': 'eq', 'fun': lambda x: sum(x) - 1.0}) 

私は、次のエラーを取得しています。

Traceback (most recent call last): 
    File "D:/applicatio/Sub Applicatio/main.py", line 338, in <module> 
    constraints= {'type': 'eq', 'fun': lambda x: sum(x) - 1.0}) 
    File "C:\Users\hp\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\_minimize.py", line 455, in minimize 
    constraints, callback=callback, **options) 
    File "C:\Users\hp\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\slsqp.py", line 383, in _minimize_slsqp 
    g = append(fprime(x),0.0) 
    File "C:\Users\hp\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\scipy\optimize\optimize.py", line 289, in function_wrapper 
    return function(*(wrapper_args + args)) 
    File "C:\Users\hp\Downloads\WinPython-64bit-3.5.1.2\python-3.5.1.amd64\lib\site-packages\ad\__init__.py", line 1090, in grad 
    return numpy.array(ans.gradient(list(xa))) 
AttributeError: 'float' object has no attribute 'gradient' 

どのように私は、単純な線形関数のこの種を最適化することができますか?助言がありますか ?ありがとう。

+1

SLSQPを使用しているようです。あなたはヤコビ行列を制約条件で渡す必要がありますか? – Prune

+1

関数が4Dであるのに対し、派生定義が1Dであるようなエラーが表示されます。どのサイズが 'ad.gh(lambda x:func(x))[0]'ですか? – aTben0

+1

'if'、' set'と 'len'の結合のために、定義された空間内に派生物が存在することは確かですか? – aTben0

答えて

2

あなたのfuncはどうなっていますか?

def func(weights): 
    .... 
    return len(set())/len(var) 

あなたはsetオブジェクトを取得し、それは長さ、項の数です。それは何を表していますか?それは線形ではありません。整数ジャンプが必要です。実際に

In [318]: x0=[0.25,0.25,0.25,0.25] 
In [319]: def func(weights): 
    ...:   var = ['x1', 'x2', 'x3', 'x4'] 
    ...:   if weights is None: 
    ...:   weights = np.ones(len(var))/len(var) 
    ...:   return len(set([var[i] for i in range(len(weights)) if weights 
    ...: [i]>0]))/len(var) 
    ...:  
In [320]: func(x0) 
Out[320]: 1.0 
In [321]: x0=np.array(x0) 
In [322]: func(x0) 
Out[322]: 1.0 
In [323]: func(x0+.1) 
Out[323]: 1.0 
In [324]: func(x0-.1) 
Out[324]: 1.0 
In [325]: func(x0-1) 
Out[325]: 0.0 

それがないすべては、4によって>0と分裂しているどのように多くのx0値のカウントされる -

minimizeので、それが0を生成し、0.25、0.5、0.75または1起こっていますx0で始まり、x0の小さな変更でfunc(x0)がどのように変化するかを把握してください。

そして、あなたのjac、私はあなたが使用する必要はないと思うjac=ad.gh(lambda x: func(x))[0]

==============

、同様にこのfuncのベースのものですlambda

`lambda x: func(x)` 

だけ引数としてfuncを与えます。正しい数の引数をとります(たとえば、x0など)。

===================あなたのコードを実行

が、jacパラメータ(私はad.ghが何であるかを知らない)なし:

In [543]: def func(weights): 
    ...:   var = ['x1', 'x2', 'x3', 'x4'] 
    ...:   if weights is None: 
    ...:   weights = np.ones(len(var))/len(var) 
    ...:   return len(set([var[i] for i in range(len(weights)) if weights 
    ...: [i]>0]))/len(var) 
    ...:  
In [544]: optimize.minimize(lambda x: func(x), x0=[0.25,0.25,0.25,0.25],method=' 
    ...: SLSQP',bounds=((0.,1.),)*4,options = {'disp':True, 'ftol': 1e-20, 'max 
    ...: iter': 1000},constraints= {'type': 'eq', 'fun': lambda x: sum(x) - 1.0 
    ...: }) 
Optimization terminated successfully. (Exit mode 0) 
      Current function value: 1.0 
      Iterations: 1 
      Function evaluations: 6 
      Gradient evaluations: 1 
Out[544]: 
    fun: 1.0 
    jac: array([ 0., 0., 0., 0., 0.]) 
message: 'Optimization terminated successfully.' 
    nfev: 6 
    nit: 1 
    njev: 1 
    status: 0 
success: True 
     x: array([ 0.25, 0.25, 0.25, 0.25]) 

x0を少し変更しようとしているようですが、少しの変更でも0にならないような変更はありません。別の言い方をすれば、あなたのfuncは既にローカル最小であるフラットな領域にあります。

+0

@hpaulij実際にあなたは正しいです。私は実際には0より大きいx0値の数を数えています。実際に私は多目的最適化を実行しており、私は完全にうまく動作している2つの目的を持っています。私はこの機能を最小限に抑える方法を理解していませんでした。私はラムダ関数なしであなたのやり方を試してみましたが、 "TypeError: 'メソッド'オブジェクトは添字付きではありません。" – muazfaiz

+0

解は3 0項と1、最大数は0ですが1に加算されると思いますか?あなたは 'jac'パラメータを削除できますか? – hpaulj

+0

これは 'jac'パラメータなしで実行されます。 – hpaulj

関連する問題