【发布时间】:2020-10-25 02:07:21
【问题描述】:
我正在尝试为以下数据拟合非对称高斯: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()
【问题讨论】:
-
看起来你可能想要一个 beta 发行版。我在this answer 中有一些代码可以完成这样的事情。这有帮助吗?
标签: python curve-fitting gaussian