You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用双峰偏态高斯拟合数据并提取基础高斯分布?

双峰偏态高斯拟合及基础高斯分布提取问题

需求概述

我有一组数据,原本采用标准双峰高斯拟合,但数据偏度过大,现需改用**双峰偏态高斯(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:23:19