我正在尝试将非对称高斯拟合到此数据:http://ge.tt/99iNaL53 (csv 文件)。
我曾尝试使用 lmfit 中的倾斜高斯模型和样条曲线,但我无法使高斯模型很好地拟合并且样条曲线不是我想要的(我不想要希望样条曲线完全符合如下所示的数据,并且更改平滑级别无济于事)。
这是使用上述数据生成下图的代码。第二个数字是我试图实现的目标示例,目的是从拟合中读取上升和下降时间。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline
from scipy.interpolate import UnivariateSpline
from lmfit.models import SkewedGaussianModel
data = np.loadtxt('data.csv', delimiter=',')
x = data[:,0]
y = data[:,1]
# Skewed Gaussian fit
model = SkewedGaussianModel()
params = model.make_params(amplitude=400, center=3, sigma=7, gamma=1)
result = model.fit(y, params, x=x)
# Cubic Spline
cs = CubicSpline(x, y)
x_range = np.arange(x[0], x[-1], 0.1)
# Univariate Spline
us = UnivariateSpline(x, y, k = 1)
# Univariate Spline (smoothed)
us2 = UnivariateSpline(x, y, k = 5)
plt.scatter(x, y, marker = '^', color = 'k', linewidth = 0.5, s = 10, label = 'data')
plt.plot(x_range, cs(x_range), label = 'Cubic Spline')
plt.plot(x_range, us(x_range), label = 'Univariate Spline, k = 1')
plt.plot(x_range, us2(x_range), label = 'Univariate Spline, k = 5')
plt.plot(x, result.best_fit, color = 'red', label = 'Skewed Gaussian Attempt')
plt.xlabel('x')
plt.ylabel('y')
plt.yscale('log')
plt.ylim(1,500)
plt.legend()
plt.show()
最佳答案
这里有问题吗?实际上,我没有看到。
lmfit
的结果最适合倾斜的高斯模型。
您已选择在对数刻度上绘制结果。这完全改变了对合身质量或不合身的看法。
您似乎期待更合身,但*太不太好。好吧,看起来您的数据并没有完全由一个偏斜的高斯表示。好像你没想到会是这样。您可以为模型函数尝试不同的形式,比如倾斜的洛伦兹函数或其他形式。但是您的数据有很低的 x
肩膀,这绝对不像您未引用的数字。
关于python - Python 中的非对称高斯拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62730830/