2017-02-10 14 views
1

私は、パーセンテージの分数で配列された粒度分布データの範囲を持っています。Pythonでビン形式の対数正規データをフィッティング

I「は何によって判断すると、私はPythonの stats.lognorm.fit機能を使用して行うことを計画している、対数正規分布にこのデータをフィットする必要があるが、これは変量ではなく、ビニングデータの配列として入力を期待しているようだ
size % 
6.68 0.05 
9.92 1.15 
etc. 

ve read

データを繰り返し処理するためにforループを使用し、プレースホルダー配列に各サイズのエントリを含めるには、ビンデータに対応するバリエーションのリストを含む配列を作成するのに必要な回数を計画していました。

これは本当に醜いと非効率的だと思うし、おそらく簡単な方法です。 binhデータをstats.lognorm.fit関数に入力する方法はありますか?

+0

。 –

答えて

0

x値が各間隔の中間点であり、y値が対応するビン頻度であると仮定して、手作業でビンデータに合わせることが考えられます。そして、scipy.optimize.curve_fitを使ってxとyの値に基づいて曲線をフィットさせます。結果の正確さは、あなたが持っている箱の数に依存すると思います。例を以下に示します。私はあなたが累積割合を集計していた誤った結論に飛びついた

import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 
import numpy as np 

def pdf(x, mu, sigma): 
    """pdf of lognormal distribution""" 

    return (np.exp(-(np.log(x) - mu)**2/(2 * sigma**2))/(x * sigma * np.sqrt(2 * np.pi))) 

mu, sigma = 3., 1.        # actual parameter value 

data = np.random.lognormal(mu, sigma, size=1000)  # data generation 
h = plt.hist(data, bins=30, normed = True) 

y = h[0]          # frequencies for each bin, this is y value to fit 
xs = h[1]          # boundaries for each bin 
delta = xs[1] - xs[0]       # width of bins 
x = xs[:-1] + delta/       # midpoints of bins, this is x value to fit 

popt, pcov = curve_fit(pdf, x, y, p0=[1, 1]) # data fitting, popt contains the fitted parameters 
print(popt) 
# [ 3.13048122 1.01360758]      fitting results 

fig, ax = plt.subplots() 
ax.hist(data, bins=30, normed=True, align='mid', label='Histogram') 
xr = np.linspace(min(xs), max(xs), 10000) 
yr = pdf(xr, mu, sigma) 
yf = pdf(xr, *popt) 
ax.plot(xr, yr, label="Actual") 
ax.plot(xr, yf, linestyle = 'dashed', label="Fitted") 
ax.legend() 

enter image description here

+0

両方のおかげです。 –

関連する問題