3

特定の平均と分散を満たすワイブル分布パラメーター(形状「k」とスケール「ラムダ」)を抽出しようとしています。この例では、平均は4、分散は8です。これは2つの未知数と2つの方程式のタイプの問題です。

このアルゴリズムはExcel2010のGRGソルバーで機能するため、問題をフレーミングする方法、または潜在的には使用しているライブラリに関するものであると確信しています。私は最適化ライブラリにあまり詳しくないので、エラーがどこにあるか教えてください。

以下はスクリプトです:

from scipy.optimize import fmin_cg
import math

def weibull_mu(k, lmda):                  #Formula can be found on wikipedia
    return lmda*math.gamma(1+1/k)
def weibull_var(k, lmda):                 #Formula can be found on wikipedia
    return lmda**2*math.gamma(1+2/k)-weibull_mu(k, lmda)**2

def min_function(arggs):
    actual_mean = 4                          # specific to this example
    actual_var = 8                           # specific to this example
    k = arggs[0]
    lmda = arggs[1]
    output = [weibull_mu(k, lmda)-(var_wei)]
    output.append(weibull_var(k, lmda)-(actual_var)**2-(actual_mean)**2)
    return output

print fmin(min_function, [1,1])

このスクリプトにより、次のエラーが発生します。

[...]
  File "C:\Program Files\Python27\lib\site-packages\scipy\optimize\optimize.py", line 278, in fmin
    fsim[0] = func(x0)
ValueError: setting an array element with a sequence.
4

2 に答える 2

4

私が知る限り、min_functionは多次元リストを返しますが、fminfmin_cgは、私が間違っていなければ、目的関数がスカラーを返すことを期待しています。

2方程式問題のルートを検索する場合は、代わりにルート関数を適用する方がよいと思います。私が知る限り、scipyはベクトル関数の一般的なオプティマイザーを提供していません。

于 2012-06-28T13:48:18.087 に答える
2

Anders Gustafsson のコメント (ありがとう) のおかげで、なんとか動作させることができました。このスクリプトは、スカラーのみを返す場合に機能するようになりました (この場合、最小二乗法に沿ったものを使用しました)。また、最適化関数を "fmin_l_bfgs_b" に変更することで境界が追加されました (これも Anders Gustafsson に感謝します)。

質問に関連する min_function 定義のみを変更しました。

from scipy.optimize import fmin_l_bfgs_b
import math

def weibull_mu(k, lmda):
    return lmda*math.gamma(1+1/k)
def weibull_var(k, lmda):
    return lmda**2*math.gamma(1+2/k)-weibull_mu(k, lmda)**2

def min_function(arggs):
    actual_mean = 4.                    # specific to this example
    actual_var = 8.                     # specific to this example
    k = arggs[0]
    lmda = arggs[1]
    extracted_var = weibull_var(k, lmda)
    extracted_mean = weibull_mu(k, lmda)
    output = (extracted_var - actual_var)**2 + (extracted_mean - actual_mean)**2
    return output

print fmin_l_bfgs_b(min_function, best_guess, approx_grad = True, bounds = [(.0000001,None),(.0000001,None)], disp = False)

注: このスクリプトは、個人用または業務用として自由に使用してください。

于 2012-06-28T15:20:16.843 に答える