簡體   English   中英

如何使用python分離兩條高斯曲線?

[英]How to use python to separate two gaussian curves?

我測量了數千個粒子的熒光強度,並制作了直方圖,顯示了兩條相鄰的高斯曲線。 如何使用python或其包將它們分成兩條高斯曲線並制作兩個新的圖? 在此輸入圖像描述

謝謝。

基本上,您需要推斷高斯混合的參數。 我將為插圖生成類似的數據集。

生成具有已知參數的混合物

from itertools import starmap

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import mlab
sns.set(color_codes=True)
# inline plots in jupyter notebook
%matplotlib inline


# generate synthetic data from a mixture of two Gaussians with equal weights
# the solution below readily generalises to more components 
nsamples = 10000
means = [30, 120]
sds = [10, 50]
weights = [0.5, 0.5]
draws = np.random.multinomial(nsamples, weights)
samples = np.concatenate(
    list(starmap(np.random.normal, zip(means, sds, draws)))
)

繪制分布圖

sns.distplot(samples)

推斷參數

from sklearn.mixture import GaussianMixture

mixture = GaussianMixture(n_components=2).fit(samples.reshape(-1, 1))
means_hat = mixture.means_.flatten()
weights_hat = mixture.weights_.flatten()
sds_hat = np.sqrt(mixture.covariances_).flatten()

print(mixture.converged_)
print(means_hat)
print(sds_hat)
print(weights_hat)

我們得到:

True
[ 122.57524745   29.97741112]
[ 48.18013893  10.44561398]
[ 0.48559771  0.51440229]

你可以調整GaussianMixture的超參數以改善擬合,但這看起來很好。 現在我們可以繪制每個組件(我只繪制第一個組件):

mu1_h, sd1_h = means_hat[0], sds_hat[0]
x_axis = np.linspace(mu1_h-3*sd1_h, mu1_h+3*sd1_h, 1000)
plt.plot(x_axis, mlab.normpdf(x_axis, mu1_h, sd1_h))

在此輸入圖像描述

PS

在旁注。 您似乎正在處理受約束的數據,並且您的觀察結果非常接近左約束(零)。 雖然高斯人可能會很好地近似你的數據,但你應該謹慎行事,因為高斯人假設不受約束的幾何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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