簡體   English   中英

如何使用線性最小二乘擬合擬合兩個重疊的高斯?

[英]How can I fit two overlapping gaussians using linear least squares fitting?

首先,我創建了一個jupyter筆記本來正確顯示代碼。 請看一下 其次,我使用線性最小二乘擬合而不是非線性最小二乘擬合速度。 我試圖解決的問題涉及在電子顯微鏡的光譜圖像上擬合大量的高斯,我們當前的nlls算法很慢。 它需要在邊界內擬合,這就是我們不使用numpy.linalg.lstsq

我正在嘗試使用scipy.optimize.lsq_linear將兩個高斯組件( g1g2 )與固定的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM