定义returns两个参数拟合后的偏斜高斯函数
Define skewed gaussian function that returns two parameters after fitting
我知道这样的问题已经被问过几次了,但我还是不明白:我想定义一个 returns 多个参数的函数。
我编写了以下代码来将数据拟合到倾斜的高斯函数中:
def skew(x, sigmag, mu, alpha, c, a):
normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
return 2*a*normpdf*normcdf + c
popt, pcov = curve_fit(skew, xdata, ydata, p0=(5.5, 57636., 4.5, 0.0001, 0.01))
y_fit= skew(xdata, popt[0], popt[1], popt[2], popt[3], popt[4])
但是,我的想法是获取数据分布的峰值,而不是 skew
函数返回的平均值作为最佳拟合值之一。因此,我需要分布的 mode
,它可以计算为 normpdf
.
的最大值
如何从我定义的函数中获取 normpdf
并获取其最大过拟合数据?
您的代码不是我们可以 运行 的最小的、完整的和可验证的示例,并且您没有提供示例输出,但我想我明白了问题。您似乎在询问 popt, pcov = curve_fit(...)
行中使用的逗号 ',' 元组解包运算符。我们将保留该行不变,并从您的函数中恢复 mode
。使用这个:
def skew2(x, sigmag, mu, alpha, c, a):
normpdf = (1 / (sigmag * np.sqrt(2 * math.pi))) * np.exp(-(np.power((x - mu), 2) / (2 * np.power(sigmag, 2))))
normcdf = (0.5 * (1 + sp.erf((alpha * ((x - mu) / sigmag)) / (np.sqrt(2)))))
return 2 * a * normpdf * normcdf + c, max(normpdf)
def skew(x, sigmag, mu, alpha, c, a):
return skew2(x, sigmag, mu, alpha, c, a)[0]
popt, pcov = curve_fit(skew, xdata, ydata, p0=(5.5, 57636., 4.5, 0.0001, 0.01))
y_fit, mode = skew2(xdata, *popt[:5])
我知道这样的问题已经被问过几次了,但我还是不明白:我想定义一个 returns 多个参数的函数。
我编写了以下代码来将数据拟合到倾斜的高斯函数中:
def skew(x, sigmag, mu, alpha, c, a):
normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
return 2*a*normpdf*normcdf + c
popt, pcov = curve_fit(skew, xdata, ydata, p0=(5.5, 57636., 4.5, 0.0001, 0.01))
y_fit= skew(xdata, popt[0], popt[1], popt[2], popt[3], popt[4])
但是,我的想法是获取数据分布的峰值,而不是 skew
函数返回的平均值作为最佳拟合值之一。因此,我需要分布的 mode
,它可以计算为 normpdf
.
如何从我定义的函数中获取 normpdf
并获取其最大过拟合数据?
您的代码不是我们可以 运行 的最小的、完整的和可验证的示例,并且您没有提供示例输出,但我想我明白了问题。您似乎在询问 popt, pcov = curve_fit(...)
行中使用的逗号 ',' 元组解包运算符。我们将保留该行不变,并从您的函数中恢复 mode
。使用这个:
def skew2(x, sigmag, mu, alpha, c, a):
normpdf = (1 / (sigmag * np.sqrt(2 * math.pi))) * np.exp(-(np.power((x - mu), 2) / (2 * np.power(sigmag, 2))))
normcdf = (0.5 * (1 + sp.erf((alpha * ((x - mu) / sigmag)) / (np.sqrt(2)))))
return 2 * a * normpdf * normcdf + c, max(normpdf)
def skew(x, sigmag, mu, alpha, c, a):
return skew2(x, sigmag, mu, alpha, c, a)[0]
popt, pcov = curve_fit(skew, xdata, ydata, p0=(5.5, 57636., 4.5, 0.0001, 0.01))
y_fit, mode = skew2(xdata, *popt[:5])