我编写了python(2.7.3)代码,其中我的目标是创建16个数据集的加权和,并将结果与某个预期值进行比较。我的问题是找到最适合模型的加权系数。为此,我一直在尝试使用scipy的optimize.minimize例程,但结果好坏参半。
我的每个数据集都存储为15x15 ndarray,因此它们的加权和也是15x15数组。我定义了自己的模型'总和应该是什么样的(也是15x15数组),并使用基本最小二乘计算量化我的结果与模型之间的拟合优度。
R=np.sum(np.abs(model/np.max(model)-myresult)**2)
' myresult'是作为一组参数“wts”的函数产生的。我想找到一组参数' wts'这会使R。
最小化为此,我一直在尝试这个:
res = minimize(get_best_weightings,wts,bounds=bnds,method='SLSQP',options={'disp':True,'eps':100})
我的目标函数是:
def get_best_weightings(wts):
wts_tr=wts[0:16]
wts_ti=wts[16:32]
for i,j in enumerate(portlist):
originalwtsr[j]=wts_tr[i]
originalwtsi[j]=wts_ti[i]
realwts=originalwtsr
imagwts=originalwtsi
myresult=make_weighted_beam(realwts,imagwts,1)
R=np.sum((np.abs(modelbeam/np.max(modelbeam)-myresult))**2)
return R
输入(wts)是形状的ndarray(32,),输出R只是一些标量,随着我的拟合变得更好,它应该变小。根据我的理解,这正是那种问题("最小化一个或多个变量的标量函数。")scipy.optimize.minimize旨在优化(http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.optimize.minimize.html)。 / p>
然而,当我运行代码时,尽管优化例程似乎迭代了wts的所有元素的不同值,但只有少数几个似乎“坚持”#。即,返回的除了四个值之外的所有值都与我的初始猜测值相同。为了说明,我绘制了我对wts(蓝色)的初始猜测值,以及红色的优化值。您可以看到,对于大多数元素,两条线重叠。 图像:
仅改变这些参数并不足以得到一个好的答案,我无法理解为什么其他参数也没有得到优化。我怀疑也许我不理解我的最小化问题的性质,所以我希望这里有人可以指出我出错的地方。
我已经尝试了各种最小化的内置方法(我决不是致力于SLSQP,或者确定它是最合适的选择),并且使用了各种各样的方法。步长' EPS。我用于参数的界限都是(-4000,4000)。我只有scipy版本.11,所以我没有测试一个流水线程序来获得全局最小值(这需要.12)。我已经看过minim.brute,但还没有尝试过实现它 - 我想我是否可以先检查一下是否有人可以引导我朝着更好的方向前进。
任何建议表示赞赏!对不起文本的墙和可能(可能是?)愚蠢的问题。如果有必要的话,我可以发布更多我的代码,但它很长并且未经修饰。