Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 差异进化_Python_Numpy_Scipy_Differential Evolution - Fatal编程技术网

Python 差异进化

Python 差异进化,python,numpy,scipy,differential-evolution,Python,Numpy,Scipy,Differential Evolution,问题是,我正试图为我的目的设计拟合程序,并希望使用scipy的差分进化算法作为初始值的一般估计量,然后将其用于LM算法,以获得更好的拟合效果。我想用DE最小化的函数是解析定义的非线性函数和一些实验值之间的最小二乘。我坚持的是功能设计。正如scipy参考中所述:“函数必须采用f(x,*args)的形式,其中x是一维数组形式的参数,args是完全指定函数所需的任何附加固定参数的元组” 我写了一个丑陋的代码示例,只是为了说明: def func(x, *args): """args[0] =

问题是,我正试图为我的目的设计拟合程序,并希望使用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))

我想将原始数据作为元组提供到函数中,但这似乎不是它的设想,因为解释器对函数不满意。这个问题应该很容易解决,但我真的很沮丧,所以我会非常感谢你的建议。

这是一个简单的解决方案,说明了这个想法,代码也不是很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)

很抱歉打扰大家,但我成功地使此代码正常工作(facepalm)…很好,@Tierpot,很高兴你能理解:)欢迎使用!既然您已经解决了问题,请删除您的问题或将您的解决方案作为答案发布。谢谢谢谢@Tierpot。对不起,我应该说得更清楚些。你能把这个问题删去,作为答案贴出来吗?底部有一个按钮,上面写着“回答你的问题”。谢谢谢谢,看起来不错!如果几天内没有其他人回答,你可以在分数旁边打勾,将其标记为“已接受答案”。酷。谢谢你发布这个。我一直在找这个。