9

問題は、私の目的に合わせてフィッティング手順を設計しようとしており、scipy の微分進化アルゴリズムを初期値の一般的な推定量として使用したいということです。これは、より適切なフィッティングのために LM アルゴリズムで使用されます。DEで最小化したい関数は、分析的に定義された非線形関数といくつかの実験値の間の最小二乗です。こだわったポイントは機能設計です。scipy リファレンスで述べられているように: "関数はf(x, *args)の形式である必要があります。ここで、x は 1-D 配列の形式の引数であり、args は完全に指定するために必要な追加の固定パラメーターのタプルです。関数"

説明のために書いた醜いコードの例があります:

def func(x, *args):
    """args[0] = x
       args[1] = y"""
    result = 0
    for i in range(len(args[0][0])):
        result += (x[0]*(args[0][0][i]**2) + x[1]*(args[0][0][i]) + x[2] - args[0][1][i])**2   
    return result**0.5

if __name__ == '__main__':
    bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)]
    x = [0,1,2,3,4]
    y = [i**2 for i in x]
    args = (x, y)
    result = differential_evolution(func, bounds, args=args)
    print(func(bounds, args))

生データをタプルとして関数に提供したかったのですが、インタープリターが関数に満足していないため、想定どおりではないようです。問題は簡単に解決できるはずですが、本当にイライラしているので、アドバイスをいただければ幸いです。

4

1 に答える 1

13

これはアイデアを示す簡単なソリューションであり、コードはあまりPythonicではありませんが、簡単にするために十分だと思います。例として、ある種類の方程式 y = ax^2 + bx + c を、方程式 y = x^2 から得られたデータに当てはめたいとします。パラメータ a = 1 および b,c が 0 に等しくなければならないことは明らかです。微分進化アルゴリズムは関数の最小値を見つけるため、一般方程式 ( y = ax^2 + bx + c) 与えられたパラメーター (いくつかの初期推測を提供) と「実験的」データ。したがって、コードに:

from scipy.optimize import differential_evolution

def func(parameters, *data):

    #we have 3 parameters which will be passed as parameters and
    #"experimental" x,y which will be passed as data

    a,b,c = parameters
    x,y = data

    result = 0

    for i in range(len(x)):
        result += (a*x[i]**2 + b*x[i]+ c - y[i])**2

    return result**0.5

if __name__ == '__main__':
    #initial guess for variation of parameters
    #             a            b            c
    bounds = [(1.5, 0.5), (-0.3, 0.3), (0.1, -0.1)]

    #producing "experimental" data 
    x = [i for i in range(6)]
    y = [x**2 for x in x]

    #packing "experimental" data into args
    args = (x,y)

    result = differential_evolution(func, bounds, args=args)
    print(result.x)
于 2015-09-02T19:44:46.173 に答える