问题是,我试图为我的目的设计拟合程序,并希望使用枕的微分进化算法作为初始值的一般估计,然后将其用于LM算法中,以获得更好的拟合效果。我想用DE最小化的函数是解析定义的非线性函数和一些实验值之间的最小二乘。我坚持的点是功能设计。正如它在any引用中所述:“函数必须是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))我想以元组的形式向函数提供原始数据,但似乎并非如此,因为解释器对该函数并不满意。这个问题应该很容易解决,但我真的很沮丧,所以建议会很感激。
发布于 2015-09-02 19:44:46
这是一个很简单的解决方案,它展示了这个想法,代码也不是很像奏鸣曲,但为了简单起见,我认为它足够好了。作为例子,我们要把y= ax^2 + bx +c的方程与方程y= x^2得到的数据进行拟合,很明显参数a=1和b,c应该等于0。由于微分进化算法找到了函数的最小值,所以我们想要找到一般方程(y = ax^2 + bx + c)的解析解(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)https://stackoverflow.com/questions/32302654
复制相似问题