[英]How can I fit two overlapping gaussians using linear least squares fitting?
首先,我創建了一個jupyter筆記本來正確顯示代碼。 請看一下 。 其次,我使用線性最小二乘擬合而不是非線性最小二乘擬合速度。 我試圖解決的問題涉及在電子顯微鏡的光譜圖像上擬合大量的高斯,我們當前的nlls算法很慢。 它需要在邊界內擬合,這就是我們不使用numpy.linalg.lstsq
我正在嘗試使用scipy.optimize.lsq_linear
將兩個高斯組件( g1
和g2
)與固定的sigma和中心組件簡單地擬合到一個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
我采用堆棧的轉置,因為lsq_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()
你混淆了什么。 您使用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包。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.