2017-06-11 4 views
10

私は配列を与えられています。私がそれをプロットすると、ノイズを伴ってガウス形状になります。私はガウシアンに合いたい。これは私がすでに持っているものですが、私がこれをプロットするとき、私は適合ガウス関数を得ません、代わりに私はただ直線を取得します。私はこのように多くの方法を試みましたが、私はそれを理解できません。ガウス曲線をどのようにしてPythonに収めることができますか?

random_sample=norm.rvs(h) 

parameters = norm.fit(h) 

fitted_pdf = norm.pdf(f, loc = parameters[0], scale = parameters[1]) 

normal_pdf = norm.pdf(f) 

plt.plot(f,fitted_pdf,"green") 
plt.plot(f, normal_pdf, "red") 
plt.plot(f,h) 
plt.show() 

click for image

答えて

6

次のようにあなたはscipy.stats.normからfitを使用することができます。

import numpy as np 
from scipy.stats import norm 
import matplotlib.pyplot as plt 

data = np.random.normal(loc=5.0, scale=2.0, size=1000) 
mean,std=norm.fit(data) 

のデータに基づいて、正規分布のパラメータに合うようにしようとnorm.fit。そして実際mean上記の例では約2とstd約5

それをプロットするために、あなたが行うことができますされている。

plt.hist(data, bins=30, normed=True) 
xmin, xmax = plt.xlim() 
x = np.linspace(xmin, xmax, 100) 
y = norm.pdf(x, mean, std) 
plt.plot(x, y) 
plt.show() 

enter image description here

青い箱があなたのヒストグラムです緑の線は、適合したパラメータを有するガウス分布である。

+0

そして、私はこのフィットしたガウスを見るために何をプロットするのですか? –

+0

@ P.Kaur私の更新された回答を参照してください –

0

独自のカスタマイズされた関数を定義できるscipy.optimize()からcurve_fitでガウス関数を適合させることもできます。ここでは、ガウス曲線近似の例を挙げています。たとえば、2つの配列xyがあるとします。あなたは(この場合はGAUSを())にフィットする関数、(我々の場合xの)独立変数の値、および値:

from scipy.optimize import curve_fit 
from scipy import asarray as ar,exp 

x = ar(range(10)) 
y = ar([0,1,2,3,4,5,4,3,2,1]) 

n = len(x)       #the number of data 
mean = sum(x*y)/n     #note this correction 
sigma = sum(y*(x-mean)**2)/n  #note this correction 

def gaus(x,a,x0,sigma): 
    return a*exp(-(x-x0)**2/(2*sigma**2)) 

popt,pcov = curve_fit(gaus,x,y,p0=[1,mean,sigma]) 

plt.plot(x,y,'b+:',label='data') 
plt.plot(x,gaus(x,*popt),'ro:',label='fit') 
plt.legend() 

curve_fit関数は、次の3つの引数で呼び出される必要があります(本発明の場合はy)。 curve_fit funtionは、最適なパラメータ(最小二乗の意味)を持つ配列と、最適なパラメータの共分散を含む第2の配列(それ以上)を返します。

以下はフィットの出力です。

enter image description here

+0

私はこの方法を使用する場合、私の適合ガウスは単なる直線です。 –

+0

本当ですか?私が得ている出力プロットを含めました。上記のコードをコピーするだけで、フィットのガウス曲線が得られます。 – Pankaj

+0

また、このメソッドは、curve_fit()を使用して任意の関数に適合できるので、他のメソッドより優れています。 – Pankaj

1

あなたはこのために便利なlmfitを見つけるかもしれません。ガウスフィッティングのための組み込みメソッドと、カーブフィッティングの問題のための多くの便利なオプションがあります。
https://lmfit.github.io/lmfit-py/builtin_models.html#example-1-fit-peaked-data-to-gaussian-lorentzian-and-voigt-profiles

+0

この方法は、シグマや平均などのさまざまなパラメータを与えるのにうまくいきましたが、元のデータにフィッティングしたGuassianをプロットするにはどうすればよいですか? –

+0

を 'out = model.fit(...)'とすると、ベストフィットモデルの配列は 'out.best_fit'に保持されます。これはデータをプロットする準備ができているはずです。 docsとexamplesフォルダにプロットを含むたくさんの実例のあるスクリプトがあります。 –

0

ガウス関数をデータセットにフィットさせる方法はたくさんあります。データをフィッティングするときに私はしばしばastropyを使用します。そのため、これを追加の答えとして追加したいのです。

import numpy as np 
from astropy import modeling 

m = modeling.models.Gaussian1D(amplitude=10, mean=30, stddev=5) 
x = np.linspace(0, 100, 2000) 
data = m(x) 
data = data + np.sqrt(data) * np.random.random(x.size) - 0.5 
data -= data.min() 
plt.plot(x, data) 

enter image description here

が、それは実際には非常に簡単ですフィット、あなたがデータにフィットするモデルを指定します。

は、私はいくつかのノイズとガウスをシミュレートしなければならないいくつかのデータセットを使用しますそしてフィッター:

fitter = modeling.fitting.LevMarLSQFitter() 
model = modeling.models.Gaussian1D() # depending on the data you need to give some initial values 
fitted_model = fitter(model, x, data) 

してプロット:

plt.plot(x, data) 
plt.plot(x, fitted_model(x)) 

enter image description here


あなたはまた、単にscipyのダウンロードを使用することができますが、機能を自分で定義する必要がありしかし:

from scipy import optimize 

def gaussian(x, amplitude, mean, stddev): 
    return amplitude * np.exp(-((x - mean)/4/stddev)**2) 

popt, _ = optimize.curve_fit(gaussian, x, data) 

これは、フィット感のための最適な引数を返し、あなたはこのようにそれをプロットすることができます:

plt.plot(x, data) 
plt.plot(x, gaussian(x, *popt)) 

enter image description here

関連する問題