当使用scipy最小化多个参数时,将常量参数传递给函数

时间:2017-07-26 12:22:02

标签: python scipy

我有一个最小平方误差函数(基于另一个函数),我想最小化(基本上获得全局最小化曲线拟合),看起来像这样:

Match:
chr1 43814981 COSM27287 G A 86.83350000000002 PASS
chr1 43815008 COSM29008;COSM43212 TGG AAA,AAG 70.3099 PASS
Missing in File1:
chr1 43814979 COSM27286 G A 86.92679999999999 PASS
Missing in File2:
chr1 43814978 COSM27286 G A 86.92679999999999 PASS

def err(a, b, X, Y): return np.sum((f(a, b, X)-Y)**2) 是评估X的点数组,具体取决于参数fab是“地面”事实“对于Y中定义的点。

现在根据我在问题2520648231388319中找到的内容,语法应如下所示:

X

不幸的是,我收到以下错误消息:

Xc = np.array([1.0, 2.0, 3.0, 4.0, 5.0])   # points at which to evaluate error function
Yc = np.array([0.2, 0.4, 0.8, 0.12, 0.15]) # ground truth
g0 = np.array([1.0, 3.0])                  # initial guess for a and b    
res = scipy.optimize.minimize(err, g0, args=(Xc, Yc), method="Powell")

如果我从元组中删除TypeError: err() takes exactly 4 arguments (3 given) Xc,则给出的参数数量会减少,所以我怀疑它位于Yc定义的某个位置,因为这似乎已通过以g0作为一个论点。

如果我有多个优化参数和我想在优化期间传递给我的函数的其他“常量”参数,我该如何正确调用err

2 个答案:

答案 0 :(得分:3)

minimize只操作一个参数,但这可以是一个数组。您需要做的是从a中的第一个参数中提取berr

def err(p, X, Y):
    a, b = p
    return np.sum((f(a, b, X)-Y)**2)

答案 1 :(得分:2)

我发现如果我定义错误函数使得它使用参数列表而不是几个参数,那么最小化是有效的:

def err(p, X, Y):
    a = p[0]
    b = p[1]
    return np.sum((f(a, b, X)-Y)**2)

然后拨打minimize

g0 = [1.0, 3.0]
res = scipy.optimize.minimize(err, g0, args=(Xc, Yc), method="Powell")