2016-11-03 6 views
1

まず、コードを正しく表示するためにjupyter notebookを作成しました。 Please take a look。 第二に、スピードのために非線形最小二乗法より線形最小二乗法を使用しています。私が解決しようとしている問題は、電子顕微鏡のスペクトル画像に多数のガウス分布を当てはめることです。現在のnllアルゴリズムは遅いです。それはなぜ我々は、私は2次元配列に、固定されたシグマと中央コンポーネントと2つのガウスコンポーネント(g1g2)のシンプルなフィットを行うためにscipy.optimize.lsq_linearを使用しようとしているnumpy.linalg.lstsq線形最小二乗フィッティングを使用して、2つのオーバーラップするガウス分布をどのように適合させることができますか?

を使用していないされた境界内でのフィッティングが必要ですGこれは、これらの2つのガウスの異なるミックスのリストです。

ガウスを画定する第1のオフ、:その後

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

および成分を混合することによりに適合するように2つのデータセットを作成する:

G1 = 5*g1 + 8*g2 
G2 = 2*g1 + 2*g2 
G = np.stack([G1,G2]).T 
次にコンポーネントを作成

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

lsq_linear関数が必要とするので、私はスタックの転置を取る形状データは(m, n)であり、ここで(m,)はフィットされるコンポーネントの形状です。

私はコンポーネントを私にdocumentationg1_res["x"]の各ミックスのための成分の重量を与える必要があります

g1_res = lsq_linear(G, g1) 
g2_res = lsq_linear(G, g2) 

を1つずつに合います。 コンポーネント戻ると重みを乗算:

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() 

Fit of gaussians to data

答えて

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パッケージがあります。

+0

ありがとう、それはそれを説明します。 – TomNorway

+0

私は以前にPCAとICAを使っていましたが、この場合実際には適用されません。既知のセンターとシグマのコンポーネントに適合しようとしていますが、振幅が非常に小さく、ICAが少し複雑になります。 – TomNorway

+0

さて、あなたは正しい方法でいると思います。他に何かありますか、これを閉じる必要がありますか? – dnalow

関連する問題