0

fmin_bfgs() または fmin_l_bfgs_b() を使用して、多くのパラメーター (7000 を少し超える) を持つ関数を最小化しようとしています。コマンドを入力すると

 opt_pars = fmin_l_bfgs_b(obj_f, pars, approx_grad=1)

(ここで、obj_f は最小化しようとしている関数であり、pars は初期パラメーターのベクトルです) 関数は、Python がプログラムを終了する必要があることを通知するまで、永久に実行されます。出力は決してありません。引数 maxfunc = 2 を追加して、それがどこかに到達しているかどうかを確認しようとしましたが、同じことが起こりました(永久に実行され、Pythonがプログラムを終了しました)。

関数の何が問題になっているのかを理解しようとしています。whileループか何かに引っかかっているようです。誰かがこの問題に遭遇しましたか? そうでない場合は、関数の動作を監視する方法について、ここで一般的なデバッグのヘルプを使用することもできます (私は比較的 Python に慣れていないため)。

最後に、誰かが私が試みているタスクに対して別の機能またはパッケージを推奨できるかもしれません。私は、なげなわ正則化されたポアソン回帰を、7000 変数の約 1200 万の観測値を持つスパース データに当てはめようとしています。

PS最小化しようとしている -log 尤度関数を含めなくて申し訳ありませんが、完全に解釈できません。

助けてくれてありがとう!

ザック

4

1 に答える 1

3

fmin_bfgsとに勾配を指定しないため、勾配が必要になるたびfmin_l_bfgs_bに目的関数が何度も評価されます。len(x) > 7000目的関数の評価が遅い場合、それは合計されます。

このmaxfunオプションは明らかに勾配推定をカウントしないため、実際には無限ループではなく、非常に長い時間がかかる可能性があります。

「Pythonはプログラムを終了する必要があると私に言っている」とはどういう意味ですか?

いずれにせよ、ここで再現可能なテストケースを提供してみてください。目的関数が理解できないかどうかは関係ありません---重要なのは、関心のある人々があなたが遭遇した状態を再現できることです。

7000個のパラメーターを使用しても、システムで無限ループの問題は発生しません。ただし、勾配が提供されていない単純な7000パラメーターの問題の場合、関数評価カウントは約200000でした。l_bfgs_bコードのプロファイルを作成して、そのような評価カウントがあなたにとって何を意味するかを確認します。グラデーションを指定すると、35(+ 35倍のグラデーション)になりました。グラデーションを提供すると役立つ場合があります。(関数が複雑な場合でも、自動微分が機能する可能性があります--- Pythonにはそのためのライブラリがあります。)

Python用の他の最適化ライブラリを参照してください:http : //scipy.org/Topical_Software(--- ipoptまたはcoin-または試してみる価値があるかもしれませんが、どちらが最適かはわかりません)

参考までに:ScipyでのL-BFGS-B実装はこれです(そして彼らが何をしているのかを知っているはずの人によって書かれています):http: //users.eecs.northwestern.edu/~nocedal/lbfgsb.html

***

pdbたとえば、Pythonデバッガーを使用して、何が起こっているかをデバッグできますpython -m pdb your_script.py。または、その中にprintステートメントを挿入するだけです。

また、Googleの「debugpython」と「profilepython」も試してみてください;)

于 2012-12-06T02:01:26.163 に答える