まず、コードを正しく表示するためにjupyter notebookを作成しました。 Please take a look。 第二に、スピードのために非線形最小二乗法より線形最小二乗法を使用しています。私が解決しようとしている問題は、電子顕微鏡のスペクトル画像に多数のガウス分布を当てはめることです。現在のnllアルゴリズムは遅いです。それはなぜ我々は、私は2次元配列に、固定されたシグマと中央コンポーネントと2つのガウスコンポーネント(g1
とg2
)のシンプルなフィットを行うために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,)
はフィットされるコンポーネントの形状です。
私はコンポーネントを私にdocumentationでg1_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()
ありがとう、それはそれを説明します。 – TomNorway
私は以前にPCAとICAを使っていましたが、この場合実際には適用されません。既知のセンターとシグマのコンポーネントに適合しようとしていますが、振幅が非常に小さく、ICAが少し複雑になります。 – TomNorway
さて、あなたは正しい方法でいると思います。他に何かありますか、これを閉じる必要がありますか? – dnalow