web-dev-qa-db-ja.com

(python)Scipyによるガンマ分布のあてはめ

誰かがPythonでガンマ分布をフィッティングするのを手伝ってくれる?さて、私はいくつかのデータを持っています:X座標とY座標、そしてこの分布に適合するガンマパラメーターを見つけたい... Scipy doc で、フィットメソッドが実際に存在することがわかりますしかし、それを使用する方法がわかりません:s ..最初に、引数「データ」はどの形式である必要がありますか。そして、それが私が探しているものなので、どのようにして2番目の引数(パラメーター)を提供できますか?

26
Archanimus

ガンマデータを生成します。

import scipy.stats as stats    
alpha = 5
loc = 100.5
beta = 22
data = stats.gamma.rvs(alpha, loc=loc, scale=beta, size=10000)    
print(data)
# [ 202.36035683  297.23906376  249.53831795 ...,  271.85204096  180.75026301
#   364.60240242]

ここで、データをガンマ分布に適合させます。

fit_alpha, fit_loc, fit_beta=stats.gamma.fit(data)
print(fit_alpha, fit_loc, fit_beta)
# (5.0833692504230008, 100.08697963283467, 21.739518937816108)

print(alpha, loc, beta)
# (5, 100.5, 22)
50
unutbu

Ss.gamma.rvs-functionが負の数を生成する可能性があるため、ガンマ分布にないはずの機能に不満を感じていました。したがって、期待値=平均(データ)および分散=変数(データ)(詳細についてはWikipediaを参照)を使用してサンプルを適合させ、scipyなしでガンマ分布のランダムサンプルを生成できる関数を作成しました(適切にインストールするのが難しいことがわかりましたが、傍注):

import random
import numpy

data = [6176, 11046, 670, 6146, 7945, 6864, 767, 7623, 7212, 9040, 3213, 6302, 10044, 10195, 9386, 7230, 4602, 6282, 8619, 7903, 6318, 13294, 6990, 5515, 9157]

# Fit gamma distribution through mean and average
mean_of_distribution = numpy.mean(data)
variance_of_distribution = numpy.var(data)

def gamma_random_sample(mean, variance, size):
    """Yields a list of random numbers following a gamma distribution defined by mean and variance"""
    g_alpha = mean*mean/variance
    g_beta = mean/variance
    for i in range(size):
        yield random.gammavariate(g_alpha,1/g_beta)

# force integer values to get integer sample
grs = [int(i) for i in gamma_random_sample(mean_of_distribution,variance_of_distribution,len(data))]

print("Original data: ", sorted(data))
print("Random sample: ", sorted(grs))

# Original data: [670, 767, 3213, 4602, 5515, 6146, 6176, 6282, 6302, 6318, 6864, 6990, 7212, 7230, 7623, 7903, 7945, 8619, 9040, 9157, 9386, 10044, 10195, 11046, 13294]
# Random sample:  [1646, 2237, 3178, 3227, 3649, 4049, 4171, 5071, 5118, 5139, 5456, 6139, 6468, 6726, 6944, 7050, 7135, 7588, 7597, 7971, 10269, 10563, 12283, 12339, 13066]
4
mondano

ディストリビューションのサポートの見積もりまたは修正についての議論を含む長い例が必要な場合は、 https://github.com/scipy/scipy/issues/1359 にあり、リンクされていますメーリングリストメッセージ。

Scipyのトランクバージョンに、フィット中に位置などのパラメーターを修正するための予備サポートが追加されました。

1
Josef

OpenTURNS には、GammaFactoryクラスを使用してこれを行う簡単な方法があります。

まず、サンプルを生成しましょう:

import openturns as ot
gammaDistribution = ot.Gamma()
sample = gammaDistribution.getSample(100)

次に、ガンマをそれに適合させます。

distribution = ot.GammaFactory().build(sample)

次に、PDFガンマを描画します。

import openturns.viewer as otv
otv.View(distribution.drawPDF())

生成されるもの:

A gamma distribution

このトピックの詳細: http://openturns.github.io/openturns/latest/user_manual/_generated/openturns.GammaFactory.html

0
Michael Baudin

1): "data"変数は、pythonリストまたはタプル、またはnumpy.ndarrayの形式にすることができます。これは、以下を使用して取得できます。

data=numpy.array(data)

上記の行の2番目のデータは、データを含むリストまたはタプルである必要があります。

2:「パラメータ」変数は、フィッティングプロセスの開始点としてフィッティング関数にオプションで提供できる最初の推測なので、省略できます。

3:@mondanoの回答に関するメモ。ガンマパラメータを計算するためのモーメント(平均および分散)の使用は、大きな形状パラメータ(alpha> 10)には適度に優れていますが、アルファの小さな値に対しては不十分な結果になる可能性があります(を参照) Wilks、THOM、HCS、1958による大気探査の方法:ガンマ分布に関する注記。Mon. Wea。Rev.、86、117–122。

Scipyモジュールで実装されているように、最尤推定量を使用することは、そのような場合に適しています。

0
Jason