问题是,我正在尝试为我的目的设计拟合过程,并希望使用scipy的差分进化算法作为初始值的一般估计量,然后将其用于LM算法中以实现更好的拟合。我想用DE最小化的函数是解析定义的非线性函数和某些实验值之间的最小二乘。我坚持的重点是功能设计。如scipy引用中所述:“函数必须采用f(x,* args)的形式,其中x是一维数组形式的参数,而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))

我想将原始数据作为元组提供给函数,但由于解释器对函数不满意,因此似乎不应该如此。这个问题应该很容易解决,但是我真的很沮丧,所以建议将不胜感激。

最佳答案

这是一个简单的解决方案,它展示了这个想法,代码也不是很好的Python语言,但是为了简单起见,我认为它已经足够好了。好的,例如,我们希望将类型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)

关于python - 科学,差异进化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32302654/

10-09 06:30