【问题标题】:Scipy, differential evolutionScipy,差异进化
【发布时间】:2015-11-24 23:32:23
【问题描述】:

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

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

【问题讨论】:

  • 很抱歉打扰大家,但我设法让这段代码工作(facepalm)...
  • 没关系,@Tierpot,很高兴你知道了 :) 欢迎来到Stack Overflow!由于您已经解决了问题,请删除您的问题或发布您的解决方案作为答案。谢谢!
  • 谢谢@Tierpot。对不起,我应该更清楚。您可以从问题中删除它并将其作为答案发布吗?底部有一个按钮,上面写着“回答您的问题”。谢谢!
  • 谢谢,看起来不错!如果几天内没有其他人回答,您可以将其标记为“已接受答案”,并在其分数旁边打勾。

标签: python numpy scipy differential-evolution


【解决方案1】:

这是一种直接的解决方案,它显示了这个想法,代码也不是很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)

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 2020-12-27
    • 2019-12-07
    • 2019-05-29
    • 1970-01-01
    • 2021-12-31
    • 2019-07-25
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多