我有一个最小平方误差函数(基于另一个函数),我想最小化(基本上获得全局最小化曲线拟合),看起来像这样:
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
的点数组,具体取决于参数f
和a
,b
是“地面”事实“对于Y
中定义的点。
现在根据我在问题25206482和31388319中找到的内容,语法应如下所示:
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
?
答案 0 :(得分:3)
minimize
只操作一个参数,但这可以是一个数组。您需要做的是从a
中的第一个参数中提取b
和err
:
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")