Scipy, 差异进化
Scipy, differential evolution
问题是,我正在尝试为我的目的设计拟合程序,并想使用 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) 给定参数(提供一些初始猜测)与 "experimental" 数据。所以,对代码:
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)
问题是,我正在尝试为我的目的设计拟合程序,并想使用 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) 给定参数(提供一些初始猜测)与 "experimental" 数据。所以,对代码:
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)