gpt4 book ai didi

matlab - 一维高斯混合拟合 Matlab/Python 中的数据

转载 作者:行者123 更新时间:2023-11-30 09:29:30 25 4
gpt4 key购买 nike

我有一条离散曲线 y=f(x)。我知道峰值的位置和幅度。我想通过在每个峰值处拟合高斯来近似曲线。我应该如何找到优化的高斯参数?我想知道是否有任何内置功能可以使我的任务更简单。

编辑

我已经固定了高斯均值并尝试使用 sigma 进行优化matlab 中的 lsqcurvefit() MSE 较小。但是,我有一个额外的硬约束,即近似曲线的值应等于峰值处的原始函数。我的模型不满足此约束。我在这里粘贴当前的工作代码。我想要一个在峰值处遵循硬约束并在其他点处近似拟合曲线的解决方案。基本思想是近似曲线参数较少,但仍与原始曲线非常相似。

fun = @(x,xdata)myFun(x,xdata,pks,locs); %pks,locs are the peak locations and amplitudes already available
x0=w(1:6)*0.25; % my initial guess based on domain knowledge

[sigma resnorm] = lsqcurvefit(fun,x0,xdata,ydata); %xdata and ydata are the original curve data points
recons = myFun(sigma,xdata,pks,locs);
figure;plot(ydata,'r');hold on;plot(recons);

function f=myFun(sigma,xdata,a,c)
% a is constant , c is mean of individual gaussians
f=zeros(size(xdata));
for i = 1:6 %use 6 gaussians to approximate function
f = f + a(i) * exp(-(xdata-c(i)).^2 ./ (2*sigma(i)^2));
end
end

最佳答案

如果您知道峰值位置和振幅,那么您剩下要做的就是找到每个高斯的宽度。您可以将其视为优化问题。

假设您有 xy,它们是您想要近似的曲线的样本。

首先,定义一个函数g(),它将构造给定宽度值的近似值。 g() 采用包含每个高斯宽度的参数向量 sigma。高斯函数的位置和幅度将被限制为您已知的值。 g() 输出 x 中每个点的高斯和近似值。

现在,定义一个损失函数L(),它将sigma作为输入。 L(sigma) 返回一个测量误差的标量 - 给定的近似值(使用 sigma)与您尝试近似的曲线的差异程度。平方误差是曲线拟合的常见损失函数:

L(sigma) = sum((y - g(sigma)) .^ 2)

现在的任务是搜索 sigma 的可能值,并找到使误差最小化的选择。这可以使用各种优化例程来完成。

如果您有 Mathworks 优化工具箱,则可以使用函数 lsqnonlin()(在这种情况下,您不必自己定义 L())。曲线拟合工具箱可能是一个替代方案。否则,您可以使用开源优化例程(查看 cvxopt)。

有几点需要注意。您需要施加约束,使 sigma 中的所有值都大于零。您可以告诉优化算法有关此约束的信息。此外,您还需要指定参数的初始猜测(即 sigma)。在这种情况下,您可以通过查看每个峰值附近的曲线来选择合理的值。在这种情况下(当损失函数为非凸时),最终的解决方案可能会有所不同,具体取决于初始猜测(即收敛到局部最小值)。有很多奇特的技术可以处理这种情况,但一个简单的方法就是尝试多种不同的初始猜测,然后选择最佳结果。

编辑添加:

在Python中,您可以在scipy.optimize模块中使用优化例程,例如curve_fit()

编辑 2(对已编辑问题的答复):

如果您的高斯函数彼此有很多重叠,那么求它们的总和可能会导致峰的高度与您的已知值不同。在这种情况下,您可以采用加权和,并将权重视为另一个参数来优化。

如果您希望峰高完全等于某些指定值,则可以在优化问题中强制执行此约束。 lsqcurvefit() 将无法执行此操作,因为它仅处理参数的绑定(bind)约束。看看fmincon()

关于matlab - 一维高斯混合拟合 Matlab/Python 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37450307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com