- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
也许有人可以帮助我。我花了几天时间,但我无法解决这个问题。提前致谢。
我想将 2 个洛伦兹人拟合到我的实验数据中。我将方程分解为两个洛伦兹 lorentz1
和 lorentz2
函数的简单形式。然后我定义了另外两个函数 L1
和 L2
只将一个常量 cnst
乘以它们。我有适合的所有 4 个参数:cnst1
、cnst2
、tau1
、tau2
。
我使用 lmfit
:建模和最小化(可能都使用相同的方法)。
初始拟合参数的设置方式在视觉上更接近精细拟合。但是最小化使用 lmfit 会丢失(下面的第一张图片):
使用这些参数:
params.add('cnst1', value=1e3 , min=1e2, max=1e5)
params.add('cnst2', value=3e5, min=1e2, max=1e6)
params.add('tau1', value=2e0, min=0, max=1e2)
params.add('tau2', value=5e-3, min=0, max=10)
但错误率很低:
cnst1: 117.459806 +/- 14.67188 (12.49%) (init= 1000)
cnst2: 413.959032 +/- 44.21042 (10.68%) (init= 300000)
tau1: 11.0343531 +/- 1.065570 (9.66%) (init= 2)
tau2: 1.55259664 +/- 0.125853 (8.11%) (init= 0.005)
另一方面,将参数包含在非常接近初始值的位置(强制与初始值一样):
使用参数:
#params.add('cnst1', value=1e3 , min=0.1e3, max=1e3)
#params.add('cnst2', value=3e5, min=1e3, max=1e6)
#params.add('tau1', value=2e0, min=0, max=2)
#params.add('tau2', value=5e-3, min=0, max=10)
拟合在视觉上更好,但错误值很大:
[[Variables]]
cnst1: 752.988629 +/- 221.3098 (29.39%) (init= 1000)
cnst2: 3.0159e+05 +/- 3.05e+07 (10113.40%) (init= 300000)
tau1: 1.99684317 +/- 0.600748 (30.08%) (init= 2)
tau2: 0.00497806 +/- 0.289651 (5818.56%) (init= 0.005)
这里是完整的代码:
import numpy as np
from lmfit import Model, minimize, Parameters, report_fit
import matplotlib.pyplot as plt
x = np.array([0.02988, 0.07057,0.19365,0.4137,0.91078,1.85075,3.44353,6.39428,\
11.99302,24.37024,52.58804,121.71927,221.53799,358.27392,464.70405])
y = 1.0 / np.array([4.60362E-4,5.63559E-4,8.44538E-4,0.00138,0.00287,0.00657,0.01506,\
0.03119,0.0584,0.09153,0.12538,0.19389,0.34391,0.68869,1.0])
def lorentz1(x, tau):
L = tau / ( 1 + (x*tau)**2 )
return(L)
def lorentz2(x, tau):
L = tau**2 / ( 1 + (x*tau)**2 )
return(L)
def L1(x,cnst1,tau1):
L1 = cnst1 * lorentz1(x,tau1)
return (L1)
def L2(x, cnst2, tau2):
L2 = cnst2 * lorentz2(x,tau2)
return (L2)
def L_min(params, x, y):
cnst1 = params['cnst1'].value
cnst2 = params['cnst2'].value
tau1 = params['tau1'].value
tau2 = params['tau2'].value
L_total = L1(x, cnst1, tau1) + L2(x, cnst2, tau2)
resids = L_total - y
return resids
#params = mod.make_params( cnst1=10e2, cnst2=3e5, tau1=2e0, tau2=0.5e-2)
params = Parameters()
#params.add('cnst1', value=1e3 , min=0.1e3, max=1e3)
#params.add('cnst2', value=3e5, min=1e3, max=1e6)
#params.add('tau1', value=2e0, min=0, max=2)
#params.add('tau2', value=5e-3, min=0, max=10)
params.add('cnst1', value=1e3 , min=1e2, max=1e5)
params.add('cnst2', value=3e5, min=1e2, max=1e6)
params.add('tau1', value=2e0, min=0, max=1e2)
params.add('tau2', value=5e-3, min=0, max=10)
#1-----Model--------------------
mod = Model(L1) + Model(L2)
result_mod = mod.fit(y, params, x=x)
print('---results from lmfit.Model----')
print(result_mod.fit_report())
#2---minimize-----------
result_min = minimize(L_min, params, args=(x,y))
final_min = y + result_min.residual
print('---results from lmfit.minimize----')
report_fit(params)
#-------Plot------
plt.close('all')
plt.loglog(x, y,'bo' , label='experimental data')
plt.loglog(x, result_mod.init_fit, 'k--', label='initial')
plt.loglog(x, result_mod.best_fit, 'r-', label='final')
plt.legend()
plt.show()
最佳答案
在搜索某些东西时,谷歌带来了我前段时间问过的自己的问题。现在我知道答案了,我在这里给出。我希望它能帮助别人。 :)
我会考虑 lmfit.minimize
函数。所以我所做的更改是绘制 lmfit.minimize
的结果。为了解决对数 y 尺度的问题(这是@mdurant 也提到的主要问题),我只是将残差除以它的 y 值(以某种方式标准化所有数据,以便在获取残差时具有可比性)。我将其命名为加权残差。
def L_min(params, x, y):
...
..
.
resids = L_total - y
weighted_resids = resids/y
return weighted_resids
因此结果由蓝线显示:
完整代码:
import numpy as np
from lmfit import Model, minimize, Parameters, report_fit
import matplotlib.pyplot as plt
x = np.array([0.02988, 0.07057,0.19365,0.4137,0.91078,1.85075,3.44353,6.39428,\
11.99302,24.37024,52.58804,121.71927,221.53799,358.27392,464.70405])
y = 1.0 / np.array([4.60362E-4,5.63559E-4,8.44538E-4,0.00138,0.00287,0.00657,0.01506,\
0.03119,0.0584,0.09153,0.12538,0.19389,0.34391,0.68869,1.0])
def lorentz1(x, tau):
L = tau / ( 1 + (x*tau)**2 )
return(L)
def lorentz2(x, tau):
L = tau**2 / ( 1 + (x*tau)**2 )
return(L)
def L1(x,cnst1,tau1):
L1 = cnst1 * lorentz1(x,tau1)
return (L1)
def L2(x, cnst2, tau2):
L2 = cnst2 * lorentz2(x,tau2)
return (L2)
def L_min(params, x, y):
cnst1 = params['cnst1'].value
cnst2 = params['cnst2'].value
tau1 = params['tau1'].value
tau2 = params['tau2'].value
L_total = L1(x, cnst1, tau1) + L2(x, cnst2, tau2)
resids = L_total - y
weighted_resids = resids/y
return weighted_resids
# return resids
#params = mod.make_params( cnst1=10e2, cnst2=3e5, tau1=2e0, tau2=0.5e-2)
params = Parameters()
#params.add('cnst1', value=1e3 , min=0.1e3, max=1e3)
#params.add('cnst2', value=3e5, min=1e3, max=1e6)
#params.add('tau1', value=2e0, min=0, max=2)
#params.add('tau2', value=5e-3, min=0, max=10)
params.add('cnst1', value=1e3 , min=1e2, max=1e5)
params.add('cnst2', value=3e5, min=1e2, max=1e6)
params.add('tau1', value=2e0, min=0, max=1e2)
params.add('tau2', value=5e-3, min=0, max=10)
#1-----Model--------------------
mod = Model(L1) + Model(L2)
result_mod = mod.fit(y, params, x=x)
print('---results from lmfit.Model----')
print(result_mod.fit_report())
#2---minimize-----------
result_min = minimize(L_min, params, args=(x,y))
final_min = y + result_min.residual
print('---results from lmfit.minimize----')
report_fit(params)
#-------Plot------
plt.close('all')
plt.loglog(x, y,'bo' , label='experimental data')
plt.loglog(x, result_mod.init_fit, 'k--', label='initial')
plt.loglog(x, result_mod.best_fit, 'r-', label='lmfit.Model')
min_result = L1(x, params['cnst1'].value, params['tau1'].value) + \
L2(x, params['cnst2'].value, params['tau2'].value)
plt.loglog(x, min_result, 'b-', label='lmfit.Minimize')
plt.legend()
plt.show()
拟合误差很好:
cnst1: 832.592441 +/- 77.32939 (9.29%) (init= 1000)
cnst2: 2.0836e+05 +/- 3.55e+04 (17.04%) (init= 300000)
tau1: 1.64355457 +/- 0.221466 (13.47%) (init= 2)
tau2: 0.00700899 +/- 0.000935 (13.34%) (init= 0.005)
[[Correlations]] (unreported correlations are < 0.100)
C(tau1, tau2) = 0.151
关于python - 通过 lmfit 模型在 python 中最小化拟合两个洛伦兹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384926/
我是 python 的新手,并尝试使用 lmfit 包来检查我自己的计算,但是我不确定 (1) 如何为以下测试(和 2)包含数据(sig)的错误我在 conf_interval2d 中遇到的错误如下所
我正在尝试使用 lmfit 使用 Model 和 Parameters 类查找某些随机数据的函数的最佳拟合参数。然而,它似乎并没有太多地探索参数空间。它进行了约 10 次函数评估,然后返回了糟糕的拟合
我正在尝试使用 lmfit 拟合部分数据(应该看起来像高斯),但我得到了一条线。请参见下图。 数据绘图: 我尝试过的代码如下: import matplotlib.pyplot as plt from
这是一个关于从 lmfit fit_report()( 1) 对象中提取拟合统计信息的问题 在this lmfit 示例,返回如下部分输出: [[Model]] Model(gaussian)
import matplotlib.pyplot as plt import numpy as np from lmfit.model import load_model def mysine(x,
我试图弄清楚如何使用 lmfit 进行截距估计包会产生不同的结果,具体取决于起始值。我使用 statsmodels 将估计结果与标准 OLS 估计结果进行比较。有人可以帮忙吗? 代码: from lm
我正在尝试使用 LMFIT 库进行多洛伦兹拟合,但它不起作用,我什至理解我的语法made 是完全错误的,但我没有任何新的想法。 我的问题是这样的:我有一个很长的光谱,其中包含多组峰,但这些组中峰的数量
在逼近(负)指数函数时,lmfit 的指数模型如何工作? 以下尝试关注https://lmfit.github.io/lmfit-py/model.html ,但未能提供正确的结果: mod = lm
我正在使用 lmfit python 包进行非线性优化 (url: http://lmfit.github.io/lmfit-py/)。我想知道在使用最小二乘拟合方法时是否可以传递雅可比函数?如果是,
尝试从 lmfit 拟合 ExponentialGaussianModel() 但收到以下错误消息:The input contains nan values 我在 Windows 上使用 Jupyt
我正在尝试使用 lmfit 拟合一些数据。最初,我使用了 Model 类,它基于此示例/教程运行良好: https://lmfit.github.io/lmfit-py/model.html但后来我想
我正在使用 lmfit 在 python 中进行拟合,在定义模型(即我想要用于拟合的函数)之后,我执行 out = model.fit(...)为了可视化结果,我这样做 plt.plot(x, out
我正在尝试将曲线拟合到一些数据(模型将是 3 个高斯加背景)。数据位于这篇文章的底部(不知道如何附加它),列是(x,y,err_y),err_y是y的平方根。这是我的代码: import numpy
我正在尝试使用 lmfit 包拟合一组数据。作为最小化例程,我选择了 Differential_evolution ( https://docs.scipy.org/doc/scipy-0.17.0/
有没有办法基于具有任意数量因变量的函数构建 lmfit 模型?例如: from lmfit import Model def my_poly(x, *params): func = 0 for
我在 Python 中使用 lmfit 来拟合一些数据,其中包括拟合变量 a、b 和 c。我需要确保 a 0 和 b - a > 0(或者 a - b y 的不等式约束应转换为 x = y + s
我想使用最小二乘法 (Levenberg-Marquardt) 最小化函数 f 中的 x 和 y。在 Python 中,我可以像下面这样使用 lmfit params = lmfit.Paramete
输出错误是: 最小化异常:如果没有合理的不确定性估计,则无法确定置信区间 为什么我收到这个错误?我如何计算不确定性估计并解决这个问题? for dosya1 in glob.glob("mean*")
我正在使用Python lmfit对 2005-2016 年的月平均数据进行最小二乘拟合。我构建了如下所示的函数: equation原始代码如下: # t is in fractional years
我正在尝试将模型拟合到某些数据。自变量称为 A 和 B,它们是 Pandas DataFrame 中的列。我正在尝试根据数据框中的 y 调整两个参数。 以前,使用 Scipy 的 curve_fit,
我是一名优秀的程序员,十分优秀!