2017-11-22 9 views
1

raw dataPython |プロット&形式でデータフィットをフィッティング(1/A)E^- Aを検索し、私が選択した答えを見つけることができない多くの後、一定

をである(X/A)私の質問をここに入れてください。

私は指数関数をy =(1/A)e ^( - x/A)の形で表示データにフィットさせ、この関数をプロットしますか?私はまだPythonでのフィッティングに慣れる必要があります。ヘルプは高く評価されます!

ありがとうございます。

+0

既に[scipy](https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)を試しましたか?上記のリンクを見つけたが、それを使用する方法がわからない場合は、あなたの質問にリンクしている画像を生成するために使用されたデータを共有することは可能ですか? –

+0

私は、左上のデータムは、寿命がわずかにゼロ以上の約160のイベントを観察したことを意味しています。そうですか? –

+0

ありがとうございました!私はSciPyで遊んでみましたが、良い結果はまだありません。私が必要とするものは、そこにある例とは少し異なるようです。さらに、私はあくまでフィッティングに精通しているわけではありません。これまでにガウスフィットと線形回帰がありました。使用されたデータは、https://pastebin.com/i3H4ZfLQにあります。 – Werkverkeer

答えて

1

私はそれを理解したように見えます。

def exponential_fit(x, a, c): 
""" 
Logarithmic fit used for the MuonLab life time measurements. 
:param x: 
:param a: 
:param c: 
:return: 
""" 
return (1/a)*np.exp(-x/a)+c 

DEF logarithmic_fit_plot(X、Y):#1 WIP フォント= { '家族': '正常' '体重': '太字' 'サイズ':20}

matplotlib.rc('font', **font) 
xdata = x 
ydata = y 
plt.rc('text', usetex=True) 
plt.plot(xdata, ydata, '.', label='sample') 
popt, pcov = sp.optimize.curve_fit(exponential_fit, xdata, ydata) 
plt.plot(xdata, exponential_fit(xdata, *popt), 'r-', 
     label=r"$\frac{1}{\tau_0}e^{\frac{-x}{\tau_0}}, \tau_0=%5.3f, c=%5.3f$" % tuple(popt)) 
plt.legend() 
plt.show() 

悲しいことに、データにはうまく適合しませんが、それは私が推測する数学の問題です。

1

このコードは適切なフィット感をもたらします。

first = True 
lifetimes = [] 
counts = [] 
with open('Werkverkeer.txt') as w: 
    next(w) 
    for line in w: 
     _, life, count = line.rstrip().split() 
     life, count = float(life), int(count) 
     if count==0: 
      continue 
     lifetimes.append(life-0.005) 
     counts.append(count) 

probs = [_/sum(counts) for _ in counts] 
print (probs) 

from scipy.optimize import leastsq 
from scipy.stats import expon 
from numpy import exp 

def residual(params, X, data): 
    model = [expon.cdf(x+0.005, scale=params[0])-expon.cdf(x-0.005, scale=params[0]) for x in X] 
    return [d-m for (d,m) in zip(data, model)] 

r = leastsq(residual, [140], args=(lifetimes, probs)) 
estimate = r[0][0] 
print (estimate) 

fitted = [expon.cdf(x+0.005, scale=estimate)-expon.cdf(x-0.005, scale=estimate) for x in lifetimes] 
print(fitted) 

from matplotlib import pyplot as plt 

plt.plot(lifetimes, probs, 'r.') 
plt.plot(lifetimes, fitted, 'b-') 

plt.show() 

curve fit

注意観光:

  • よりもむしろcountsにフィット数が本当に得るための方法ですので、私は、確率の推定値である正規化countsに装着しました生涯の確率密度関数の推定値で計算する。
  • 私はカウントを使用しているので、パラメータの与えられた値に対して、ビンの境界の間で密度関数の下に領域を合わせる必要があります。したがって、ラインmodel =
  • いつものように、residualの最終行は、観測された確率(カウントに基づく)と仮計算された確率の差を返します。

leastsqは、パラメータとして0.0497646352872の値を返します。

関連する問題