因此,我有一组值(图片中半径上的中值强度值),并且我想拟合一个多项式函数来模拟图片中的渐晕效果。 问题在于,scipy.optimize.minimize函数仅向我返回所有0参数。
如果要复制我在做什么,以下是Z_RB的一些示例数据: 注意:在拟合过程中,应该忽略最后的0值。 https://pastebin.com/MKqKgPFr 数据图:https://imgur.com/a/7HRM3N5
此外,约束不起作用,我需要使函数单调递减并从1开始。错误为“ IndexError:用作索引的数组必须为整数(或布尔值)类型”这不是主要问题,但是如果您有关于我的建议,我会很高兴听到它,我可能会在配件本身起作用后立即为此创建第二个问题。
我的大多数代码以前都在其他实例中工作过。 scipy.optimize.minimize的调用已经使用了简化的函数,但是由于我还没有使用它,所以我可能以错误的方式调用了某些东西 据我测试,该功能是完善的。 损失也应该起作用,但最有可能是造成这种情况的元凶,因为那曾经导致了问题。 计算Z_RB的工作原理,我确定。
调用拟合函数(p是多项式的次数):
7.3.0
拟合函数:
polpar = np.zeros(p)
if config["fitter"]==1:
V_fit = calc.fit_my_polyfit(Z_RB, polpar, filename)
损失函数:
def fit_my_polyfit(Z_RB,param,title):
last = np.amax(np.flatnonzero(Z_RB))
print("polyfit with regularization")
r = np.arange(0, len(Z_RB),dtype='uint32')
b = (None,None)
bnds = (b,)
for i in range(len(param)-1):
bnds = bnds + (b,)
cons = ({'type': 'ineq', 'fun': lambda param: -np.diff(f(r,param))},
{'type': 'eq', 'fun': lambda param: f(r, param)[0]-1})
#The Constraints don't work, so they aren't called at the Moment
res = minimize(loss, param, method='trust-constr', args=(Z_RB[3:last]), bounds=bnds)
print(res.x)
var = res.x
V_fit = f(r,var)
Z_corr = np.minimum(np.divide(Z_RB, V_fit), 1)
plt.figure(1)
plt.clf()
plt.plot(r, Z_RB, 'b-')
plt.plot(r, V_fit, 'r-')
plt.plot(r, Z_corr, "g-")
plt.show()
return V_fit
多项式函数:
def loss(param, Z_RB):
r = np.arange(0, len(Z_RB),dtype='uint32')
V = f(r,param)
ll = 1
lr = 1
L2 = m.sqrt(np.sum(np.power(np.subtract(Z_RB,f(r, param)),2)))
reg = np.sum(np.power(param,2))
return ll*L2 +lr*reg
这是当前输出: https://pastebin.com/P8iCCjan