2012-11-20 19 views
7

フィッティングと乱数の取得に関する質問があります。まず、私はデータ点からヒストグラムを有するヒストグラムからヒストグラムの確率密度関数を別のヒストグラムに合わせる

:など

状況です。このヒストグラムを確率密度関数(たとえば2つの自由なパラメータ)として解釈して、乱数を生成するために使用でき、その関数を別のヒストグラムに合わせたいと考えています。

+7

このクエストインは再開して改善する必要があります。 –

+2

質問を理解できない場合は、これが質問ではないと確信できません。最初に理解してみてください。私はサウロに加入する。 – Geeocode

答えて

4

累積密度関数を使用すると、任意の分布から乱数を生成することができます(described here)。

平滑な累積密度関数を作成するためにヒストグラムを使用することは、あまり意味がありません。例えば、scipy.interpolate.interp1d()の補間をビンの中心間の値に使用することができます。ビンとアイテムの数がかなり多いヒストグラムではうまく動作します。しかし、確率関数のテールの形、すなわち、最小のビンより小さいか、または最大のビンより大きい値の値を決定する必要があります。たとえば、ヒストグラムにガウス関数を当てはめることに基づいて分布ガウシアンテールを与えることができます)、または問題に適したテールの他の形式を使用するか、単にその分布を切り捨てることができます。

例:これは尾を処理しない、そしてそれはビンが良くエッジ処理できるが、それはあなたが同じ分布を持つ複数の値を生成するために、ヒストグラムを使用して始めるでしょう

import numpy 
import scipy.interpolate 
import random 
import matplotlib.pyplot as pyplot 

# create some normally distributed values and make a histogram 
a = numpy.random.normal(size=10000) 
counts, bins = numpy.histogram(a, bins=100, density=True) 
cum_counts = numpy.cumsum(counts) 
bin_widths = (bins[1:] - bins[:-1]) 

# generate more values with same distribution 
x = cum_counts*bin_widths 
y = bins[1:] 
inverse_density_function = scipy.interpolate.interp1d(x, y) 
b = numpy.zeros(10000) 
for i in range(len(b)): 
    u = random.uniform(x[0], x[-1]) 
    b[i] = inverse_density_function(u) 

# plot both   
pyplot.hist(a, 100) 
pyplot.hist(b, 100) 
pyplot.show() 

P.S.いくつかの値で記述された特定の既知の分布に適合するように試みることもできます(これはあなたが質問に挙げたものだと思います)。しかし、上記の非パラメトリックなアプローチはより一般的な目的です。

+0

、すばやい返信ありがとう、補間も私の心の中でしたが、最初に述べたように、それは外れ値を扱うことはできませんし、それは実際には密度関数ではなく、最初のヒストグラムのコピーです。 – madzone

+2

これは私の最終版ですが、スムーズに動作します。ありがとうございました。 'bins = np.linspace(0、.5、num = 800) counts18、bins = np.histogram(Z_DATA [InData18]、bins = bin) x = np.cumsum(counts18)* 1./np。合計(カウント18)* 1。 y = bins [範囲(len(x)+1)] y = y [1:] fit = scipy.interpolate.interp1d(x、y) plt.hist(fit(np.random.uniform (データ、アルファ= 0.3、ビン= y) plt.show() '(ビン= y) plt.hist – madzone

関連する問題