如何用双峰偏态高斯拟合数据并提取基础高斯分布?
双峰偏态高斯拟合及基础高斯分布提取问题
需求概述
我有一组数据,原本采用标准双峰高斯拟合,但数据偏度过大,现需改用**双峰偏态高斯(bimodal skewed gaussian)**进行拟合。数据形态为左侧正偏态、右侧负偏态,同时希望能从拟合结果中提取对应的基础高斯分布。
现有标准双峰高斯拟合代码
import numpy as np from scipy.signal import find_peaks from scipy.optimize import curve_fit import matplotlib.pyplot as plt def gauss(x, mu, sigma, A): return A * np.exp(-(x - mu)**2 / (2 * sigma**2)) def bimodal(x, mu1, sigma1, A1, mu2, sigma2, A2): return gauss(x, mu1, sigma1, A1) + gauss(x, mu2, sigma2, A2) params = np.empty(6, dtype=object) for i in range(len(files)): x = data_x[i] y = data_y[i] max_count = np.max(data_y[i][2:]) peaks, _ = find_peaks(data_y[i], height=max_count - 5, distance=4) p_init = [data_x[i][peaks[0]], 1, max_count, data_x[i][peaks[1]], 1, max_count] params, cov = curve_fit(bimodal, x[:len(y)], y, p_init) params = np.vstack([params, params]) x = x.astype(int) plt.bar(x[:len(y)], y) plt.plot(x, bimodal(x, *params), 'r') plt.title(f"{naming_string[i]} -> index = {i}") plt.show()
尝试的偏态拟合方案
基于scipy的skewnorm实现了双峰偏态拟合函数,但存在问题:无法从拟合结果中提取对应的基础高斯分布,拟合得到的振幅、均值与无偏高斯分布不匹配。代码如下:
from scipy.stats import skewnorm def bimodal_skew_normal(x, amp1, mean1, std1, skew1, amp2, mean2, std2, skew2): pdf1 = amp1 * skewnorm.pdf(x, skew1, loc=mean1, scale=std1) pdf2 = amp2 * skewnorm.pdf(x, skew2, loc=mean2, scale=std2) return pdf1 + pdf2
内容的提问来源于stack exchange,提问作者Katherine Cochrane
相关产品推荐
相关产品推荐

