如何使用线性最小二乘拟合拟合两个重叠的高斯?

时间:2016-11-03 17:06:17

标签: python numpy

首先,我创建了一个jupyter notebook来正确显示代码。 Please take a look。 其次,我使用线性最小二乘拟合而不是非线性最小二乘拟合速度。我试图解决的问题涉及在电子显微镜的光谱图像上拟合大量的高斯,我们当前的nlls算法很慢。它需要在边界内拟合,这就是我们不使用numpy.linalg.lstsq

的原因

我正在尝试使用scipy.optimize.lsq_linear将两个高斯分量(g1g2)与固定的sigma和中心分量简单拟合到一个2D数组{{1这是两位高斯的不同混音的列表。

首先,定义高斯:

G

然后创建组件:

def gaussian(x, mu, sig):
    return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))

然后通过混合组件创建两组数据:

x = np.linspace(-3, 3, 100)
g1 = gaussian(x, -0.5, 0.5)
g2 = gaussian(x, 0.5, 0.5)

我进行了堆栈的转置,因为G1 = 5*g1 + 8*g2 G2 = 2*g1 + 2*g2 G = np.stack([G1,G2]).T 函数要求数据的形状为lsq_linear,其中(m, n)是要适合的组件的形状。

我通过

逐个调整组件
(m,)

,它应该为documentationg1_res = lsq_linear(G, g1) g2_res = lsq_linear(G, g2) 中每个混音的组件提供权重。 将权重与组件相乘会返回:

g1_res["x"]

但是,合适(第一次混合如下所示)不正确。有人能帮我弄清楚我做错了吗?

g1_fit = [g1*fit for fit in g1_res["x"]]
g2_fit = [g2*fit for fit in g2_res["x"]]

Fit of gaussians to data

1 个答案:

答案 0 :(得分:0)

你混淆了什么。您使用1个组件拟合所有测量的光谱。相反,您希望使用两个组件来拟合每个光谱。因此,需要交换的东西:

g = np.stack([g1,g2]).T

g1_res = lsq_linear(g, G1)
g2_res = lsq_linear(g, G2)



g1_res["x"]
# --> array([ 5.,  8.])
g2_res["x"]
# --> array([ 2.,  2.])

顺便说一句,如果你有很多光谱,高斯的形状参数(这里给出[+ -0.5,0.5])总是相同但不知道或形状相同但理想情况下甚至不对应对于高斯,那么你可能想尝试主成分分析。 已有Python包。