【问题标题】:Minimization through lmfit通过 lmfit 最小化
【发布时间】:2019-11-29 09:02:54
【问题描述】:

我想估计 x 的值。所以当我将 x 作为我的参数时,这是对我有用的代码。

`

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Parameters, minimize
from numpy import exp, linspace, random


def gaussian(x, amp, cen, wid):
    return amp * exp(-(x-cen)**2 / wid)


x = linspace(-10, 10, 101)
data = gaussian(x, 2.33, 0.21, 1.51) + random.normal(0, 0.2, x.size)
Model = gaussian(x, 2.33,0.21,1.51)

plt.plot(x, data, label = 'data')
plt.plot(x, Model, label = 'Model')
plt.legend()
plt.grid(True)
plt.show()


d = 50
print ("\nThe data value at {} is {}\n".format(0, data[0+d]))

params = Parameters()
params.add('x', value =-3)    


def objective(params, amp, cen, wid, data):
    x = params['x']
    m = gaussian(x, amp, cen, wid)
    return data - m


result = minimize(objective, params=params, args=(2.33, 0.21, 1.51,data[d]))
print(result.params)

`

所以这里我的参数是 x。 在我的目标函数中,我给出了 50 处的数据值,它对应于 0 处的 x。 我将参数的初始值初始化为接近 0,因此我将其设置为 -3。

当您打印 result.params 时,您会看到它收敛到 0。

现在如果我将 amp cen 和 wid 作为参数,它会给我一个错误

TypeError:*后的objective()参数必须是可迭代的,而不是numpy.float64

`

import numpy as np
import matplotlib.pyplot as plt
from lmfit import Parameters, minimize
from numpy import exp, linspace, random

def gaussian(x, amp, cen, wid):
    return amp * exp(-(x-cen)**2 / wid)    

x = linspace(-10, 10, 101)
data = gaussian(x, 2.33, 0.21, 1.51) + random.normal(0, 0.2, x.size)
Model = gaussian(x, 2.33,0.21,1.51)

plt.plot(x, data, label = 'data')
plt.plot(x, Model, label = 'Model')
plt.legend()
plt.grid(True)
plt.show()


d = 50
print ("\nThe data value at {} is {}\n".format(0, data[0+d]))

params = Parameters()
params.add('x', value =-5)
params.add('amp', value = 1)
params.add('cen', value = 1)
params.add('wid', value = 1)

def objective(params, data):    
    x = params['x']
    amp = params['amp']
    cen = params['cen']
    wid = params['wid']

    m = gaussian(x, amp, cen, wid)
    return data - m


result = minimize(objective, params=params, args=( data[d]))
print(result.params)

`

我做错了什么?

【问题讨论】:

    标签: python numpy minimize minimization lmfit


    【解决方案1】:

    嗯,基本上您要求更改 4 个不同的变量(xampcenwid)以匹配 1 个数据点:data[d]。你得到的错误信息:

    ......
        out = self.userfcn(params, *self.userargs, **self.userkws)
    TypeError: objective() argument after * must be an iterable, not numpy.float64
    

    是拟合告诉您目标函数的返回值必须是数组,而不是单个浮点数。

    包含 4 个变量的拟合至少需要 4 个 y 值。否则,您可以在连续的值范围内更改xampcenwid,以使gaussian(x, amp, can, wid) 匹配data[d]——该问题没有单一的解决方案。

    如果想法是找到一个高斯函数采用单个特定 y 值的 x 值,您可以使用“寻根”来做到这一点——至少在可能的范围内对于每个有效的y 值,将至少有 2 个x 值。

    为此,您可以使用scipy.optimize.root 查找gaussian(x, amp, cen, wid) - data[d] 为零的位置的值:

    def objective(x, amp, cen, wid, yval):
         return gaussian(x, amp, cen, wid) - yval
    
    from scipy.optimize import root
    init_x = 0.0  # initial guess for `x` value
    result = root(objective, init_x, (100, 1.22, 2.5, data[50]))
    print(result.x) 
    

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多