2013-12-09 24 views
6

私は2つの2D-配列aとfuncionインサイドbscipy.optimize関数に大きなステップを強制するには?

を比較する関数compare_images(k, a, b)を持って、私はsigma=k私の考えはにために画像aを滑らかにするためにどのくらい私がしなければならない推定することであるaにしてgaussian_filterを適用します画像のようになりb

問題はk変動が0.5を超えている場合にのみ、異なる値を返します。私の機能compare_imagesある、と私はfmin(compare_images, init_guess, (a, b)をすれば、それは通常init_guess値にはまり込みます。

私はこの問題はfmin(およびminimize)である私の場合にはcompare_imagesのためにまったく同じ戻り値を再現し、その方法は、それがすでに最小を見つけたと思います非常に小さなステップで始まる傾向があると考えています。それは数回だけ試みます。

fminやその他の最小化機能をより大きな手順を踏むようにする方法がありますか?scipyそれとも私の必要性に適した方法がありますか?

編集: 一時的な解決策が見つかりました。 最初に、私はfminの引数としてxtol=0.5以上を使用しました。 それでも、私はまだいくつかの問題があり、数回fmininit_guessを返します。 その後、fmin == init_guessの場合、別のランダムなinit_guessを生成してもう一度やり直すように、単純なループを作成しました。

これはかなり遅いですが、今は走らせています。それは私のすべてのデータのためにそれを実行するには20hかかりますが、私はそれを再度行う必要はありません。とにかく

、より良い、より良い解決策を見つけることにまだ興味がある人のための問題を説明するために:私はいくつかの科学的データを含む、2枚の画像、ABを持って

  • A変数値を持ついくつかのドットのように見える(これは、イベントが発生した場合の各値の点を表し、それは強度だたのマトリクス'S)
  • Bを平滑化ヒートマップのように見える(それが出現の観察密度)
  • Bは、セミランダムノイズのビットを使用してAにガウスフィルタを適用した場合と似ています。
  • 定数sigmaAのガウスフィルタを適用して、Bを近似しています。このsigmaは視覚的に選択されましたが、特定の種類の画像に対してのみ機能します。
  • 私は画像ごとに最適なsigmaを取得しようとしていますので、後でいくつかの関係がsigmaであり、各画像にイベントのクラスが示されています。

とにかく、ありがとう!

+1

だから、あなたはその後、別の最小を探していますか? –

+2

おそらく最良の方法ではありませんが、最も簡単なのは、変数または最小化された値に線形スケーリングを適用することです。 scipy最適化関数にはかなりの数のハードコードされた値があります。 'xtol'で遊ぶことも役に立ちます。 – Daniel

+0

* b *が既に平滑化されていない限り、画像* a *と画像* b *の両方を滑らかにして似ているように思えるかもしれません。その場合、2つの画像の類似度をどのように測定しているかによって、* a *だけに適用されたスムージングは​​実際にはより類似しているのではなく* b *に似ています。あるいは、 'k 'のバリエーションが0.5未満であっても、類似性のために異なる値を返すように、compare_images()で異なる類似度を使用しようとすることができます。あなたの関数 'compare_images()'を表示すると、人々に提案があるでしょうか? – Simon

答えて

3

クイックチェック:実際にはfmin(compare_images, init_guess, (a,b))を意味していますか?

gaussian_filterのように振る舞う場合、関数は区分的に定数になります。つまり、派生関数に依存するオプティマイザ(ほとんどのもの)が外れていることを意味します。 annealのようなグローバルオプティマイザ、またはkの感知可能な範囲でブルートフォース検索を試みることができます。

しかし、問題を説明したように、baの平滑化バージョンである場合、一般的には、compare_imagesの明確なグローバル最小値しか存在しません。両方の画像を最も似ているaのスムージングの量を決定したい場合は、あなたのアプローチが理にかなっています。

質問が「画像がどれほど類似しているか」という質問がある場合は、ピクセル単位の比較(たぶんスムージングを少しずつ行っている)があると思います。私たちが話している画像によっては、画像を最初に整列させる必要があります(写真の比較など)。役立つかもしれないもう一つのアイデア:: - シグマと1 = floor(k)ceil(k)と1(すなわちラウンドKネクストにそれがsmoothed- aの2つのバージョンを計算するようにcompare_imagesを書き換え:-)

編集を明確にしてくださいより低い/より高いint)。次いで、a_smooth = a_floor*(1-kfrac)+a_ceil*kfracを計算し、kfracは小数部の部分をkとします。このようにして、比較関数は連続w.r.t kになります。

Good Luck!

+0

あなたはそうです、それは 'k'ではなく、' fmin'の中で 'compare_images'です。元の投稿で明確にしようとする – user2329994

1

Basin hoppingこれは、プラトーで止まっても継続している可能性が高いため、少し上手くいくかもしれません。

私はそれが低温で合理的に良くないことは、この例の機能で見つかった:

>>> opt.basinhopping(lambda (x,y): int(0.1*x**2 + 0.1*y**2), (5,-5), T=.1) 
    nfev: 409 
    fun: 0 
     x: array([ 1.73267813, -2.54527514]) 
message: ['requested number of basinhopping iterations completed successfully'] 
    njev: 102 
    nit: 100 
関連する問題