Python 言語における SciPy 差分進化とは?
Scipy は、科学的および数学的な問題を解決するために使用される、表面的で無料のわかりやすいライブラリです。 SciPy は、そのライブラリが貴重なモジュールでいっぱいであるため、開発者にとって宝箱です。 SciPy は、貴重なアルゴリズムのクラスターを使用して NumPy の機能を拡張します。 SciPy ライブラリには、scipy.io、scipy.optimize などの計算に使用できるサブパッケージがあります。SciPy は、scipy.optimize パッケージで「微分進化」関数と多くの強力な関数を生成します。 scipy.optimize は、Python アプリケーションでの最適化に使用されます。
差分進化関数は、SciPy 最適化パッケージによって取得されるグローバル関数であり、多変量関数のグローバル最小値を見つけるために使用されます。非線形で微分不可能な多次元目的関数を管理できます。これは、連続空間関数の領域を検索するために使用される検索アルゴリズムです。この関数は実数値で機能します。
差分進化関数の構文
差分進化関数は、differential_evolution () 関数を利用して Python に存在します。差分進化関数の構文を以下に示します。
関数のパラメーターを見てみましょう。
関数は f(x,*args) で呼び出せる必要があります。境界は、次の 2 つの方法で指定できる一連の変数を指します。戦略はオプションであるか、デフォルト値が「best1bin」の文字列です。 maxiter はオプションまたは int 値です。 popsize は int またはオプションです。 tol は int またはオプションです。ミューテーション値は float またはオプションです。組換え値は float またはオプションです。シードは none、int、NumPy、および Random です。
次のセクションでは、簡単な例を使用して微分進化関数について説明します。
例 1
微分進化関数の概念を理解することに興味を持つ簡単な例から始めましょう。最小値を見つけるために、differential_evolution() 関数を使用しました。ただし、最小値を見つけるために、関数には検索範囲と定義済みの呼び出し可能な目的関数が必要でした。そのため、プログラムで difference_evolution 関数を使用する前に関数を定義します。プログラムの参照コードは次のとおりです。
輸入 でこぼこ なので 例えばから スパイ 輸入 最適化
から スパイ。 最適化 輸入 微分進化
輸入 matplotlib. パイプロット なので パイ
から matplotlib 輸入 cm
デフォルト 機能 ( p ) :
と 、 バツ = p
時間 = 例えば 平方根 ( と ** 4 +×** 4 )
戻る 例えば 平方根 ( 時間 )
DE_境界 = [ [ - 6 、 6 ] 、 [ - 6 、 6 ] ]
解像度 = 微分進化 ( 機能 、 DE_境界 )
印刷する ( 解像度 )
配列数値計算用に SciPy や NumPy などのライブラリをインポートしました。 scipy.optimize モジュールから difference_evolution 関数をインポートしました。次に、キーワード「def」を使用して、呼び出し可能な目的関数を定義し、パラメーター「p」を渡します。 NumPy 変数の加算の平方根、つまり z、x を求める関数の定義に成功しました。平方根の値は、変数「h」に格納されます。定義された関数で平方根の値を返します。引数として返されます。
その後、関数の最小値と最大値を説明することで、項目化できる変数の範囲を決定します。 「DE_bounds」を引数として difference_evolution 関数を実行します。 res という名前の変数を使用して関数値を呼び出しました。最後に、print ステートメントを使用して出力を表示します。プログラムを実行すると、結果が表示されました。予想される出力のスクリーンショットを以下に示します。
Differential_evolution() は、関数の最小値がポイント (0, 0) に表示されることを示しています。
例 2
これは、差分進化関数の別の例です。ここでは、配列を取得し、配列間で異なる操作を適用します。プログラムの参照コードは次のとおりです。
輸入 でこぼこ なので 例えばから スパイ 輸入 最適化
から スパイ。 最適化 輸入 微分進化
デフォルト Objective_Func ( d ) :
戻る ( d [ 1 ] - 1.2 ) / 2 + 0.5 * 日 [ 0 ] * 1.3 * ( d [ 1 ] + 0.5 ) ** 3
_bounds = [ ( - 0.3 、 0.3 ) 、 ( - 0.3 、 0.3 ) ]
表示 = 微分進化 ( Objective_Func 、 _bounds 、 ポップサイズ = 80 、 研磨 = 間違い )
印刷する ( 表示 )
前のスクリーンショットに示すように、SciPy.optimize.differential_evolution ライブラリと NumPy ライブラリをプログラムに正常にインポートしました。ここで、目的関数を定義し、それに対して最小値を見つけます。目的関数に数式を渡し、定義された関数に引数として値を返しました。関数値間の境界は必須です。そのため、関数を定義した後、両方の値 (最大値と最小値) を修正しました。
すべての重要な変数を定義した後、differential_evolution 関数を呼び出して、関数の最小値を見つけました。関数の最小戻り値を変数 disp に保存しました。プログラムの最後で、print ステートメントに disp 変数を渡して結果を表示します。プログラムを実行すると、定義された関数の最小値が境界付きで画面に表示されます。出力は次のとおりです。
例 3
ご覧のとおり、微分進化は、目的関数の定義に基づいて、目的関数のさまざまな最小値を返します。ここで、differential_evolution() に関連する別の例を取り上げます。このプログラムの参照コードを以下に示します。
輸入 でこぼこ なので 例えばから スパイ 輸入 最適化
から スパイ。 最適化 輸入 微分進化
デフォルト obj_func ( オペラ ) :
戻る 3 ** 9 / 0.2 + 6 / 3 * 2 ** 20
境界 = [ ( - 0.5 、 0.5 ) 、 ( - 0.5 、 0.5 ) ]
アウト = 微分進化 ( obj_func 、 境界 、 研磨 = 真実 )
印刷する ( '出力は次のとおりです: ' 、 アウト )
ライブラリがないと、必要な操作を実行できないため、ライブラリはこのプログラムに正常にインポートされます。その結果、プログラムに SciPy ライブラリを含めます。その後、必要な操作で目的関数を定義します。その定義された関数の最小値を見つけます。関数の境界を調整した後、微分進化で定義された関数を呼び出して、関数の最小値を見つけました。これは変数に保持されます。これを表示するには、print ステートメントでこの変数を呼び出します。このプログラムの出力を以下に示します。
前のスクリーンショットのように、関数の最小値は [0.29236931, 0.16808904] です。これらの例をご使用の環境で実行して、differential_evolution 関数の概念をよりよく理解することもできます。
結論
この記事を簡単に要約してみましょう。 PythonのSciPyライブラリに属する微分進化法の基本機能をつかみました。 Python は最新の言語であり、多数の柔軟なライブラリがあります。ほとんどの開発者は、定義済みの関数とライブラリによって複雑なコード構造を解決するのに役立ちました。差分進化は、SciPy パッケージの最適化関数または最小化に使用される方法です。これらの前の例をコードで使用すると、差分進化の概念をより明確に理解できます。