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

Python 如何使用线性最小二乘拟合来拟合两个重叠的高斯?,python,numpy,Python,Numpy,首先,我创建了一个。 第二,我使用线性最小二乘法拟合速度,而不是非线性最小二乘法拟合速度。我试图解决的问题涉及在电子显微镜的光谱图像上拟合大量高斯分布,而我们目前的nlls算法速度很慢。它需要在边界内进行拟合,这就是为什么我们不使用numpy.linalg.lstsq 我试图使用scipy.optimize.lsq_linear对两个高斯分量(g1和g2)进行简单拟合,并将其固定西格玛和中心分量,拟合到一个2D数组G,该数组是这两个高斯分量的不同混合列表 首先,定义高斯分布: def gauss

首先,我创建了一个。 第二,我使用线性最小二乘法拟合速度,而不是非线性最小二乘法拟合速度。我试图解决的问题涉及在电子显微镜的光谱图像上拟合大量高斯分布,而我们目前的nlls算法速度很慢。它需要在边界内进行拟合,这就是为什么我们不使用
numpy.linalg.lstsq

我试图使用
scipy.optimize.lsq_linear
对两个高斯分量(
g1
g2
)进行简单拟合,并将其固定西格玛和中心分量,拟合到一个2D数组
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 
然后通过混合组件创建两组数据:

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\u linear
函数要求数据的形状为
(m,n)
,其中
(m,)
是要拟合的组件的形状

我一个接一个地安装部件

g1_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"]]
但是,配合(第一次混合如下所示)不正确。有人能帮我找出我做错了什么吗

plt.plot(x,G.T[0], label="mixed_signal")
plt.plot(x,g1_fit[0], label="gaussian 1")
plt.plot(x,g2_fit[0], label="gaussian 2")
plt.legend()

你把一些东西弄混了。您正在使用一个分量拟合所有测量的光谱。相反,您希望使用两个分量拟合每个光谱。因此,需要交换东西:

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包

你搞错了什么。您正在使用一个分量拟合所有测量的光谱。相反,您希望使用两个分量拟合每个光谱。因此,需要交换东西:

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包

谢谢,这就解释了。我以前使用过PCA和ICA,但它在这种情况下并不适用-我们试图拟合已知中心和西格玛的分量,但在某些情况下,它们的振幅非常小,ICA变得有点棘手。好吧,那么我想你的方法是对的。还有其他事情吗,或者我们应该结束这件事吗?让我们结束这件事。谢谢你的帮助。如果我需要,我会再问一次!谢谢,这就解释了。我以前使用过PCA和ICA,但它在这种情况下并不适用-我们试图拟合已知中心和西格玛的分量,但在某些情况下,它们的振幅非常小,ICA变得有点棘手。好吧,那么我想你的方法是对的。还有其他事情吗,或者我们应该结束这件事吗?让我们结束这件事。谢谢你的帮助。如果我需要,我会再问一次!