4

stats.norm.rvs の場合と同じように、SciPy の分布から乱数を取得しようとしています。ただし、私が持っている経験的分布から数値を取得しようとしています-それは歪んだデータセットであり、歪曲と尖度を私が描いている分布に組み込みたいです。理想的には、 stats.norm.rvs(loc=blah,scale=blah,size=blah) を呼び出してから、平均と分散に加えてスキューとカートも設定したいと思います。ノルム関数は、s と k がスキューと尖度を表す「mvsk」の配置で構成される「モーメント」引数を取りますが、明らかに s と k が rv から計算されるように要求するだけです。まず、分布のパラメータとして s と k を確立します。

とにかく、私は決して統計の専門家ではありません。おそらく、これは単純な、または見当違いの質問です。助けていただければ幸いです。

編集:分布を十分に定義するのに4つの瞬間が十分でない場合、次のような経験的分布と一致する値を描画する他の方法はありますか:http://i.imgur.com/3yB2Y.png

4

4 に答える 4

1

分布の裾に入る心配がなく、データが浮動小数点である場合は、経験的分布からサンプリングできます。

  • データを並べ替えます。
  • データの前に 0 を追加します。
  • N がこの data_array の長さを表すとします。
  • q=scipy.rand()*N を計算します
  • idx=int(q); di=q-idx
  • xlo=data_array[idx], xhi=data_array[idx+1];
  • xlo+(xhi-xlo)*di を返す

基本的に、これは経験的CDFで線形補間して確率変量を取得します。

2 つの潜在的な問題は、(1) データ セットが小さい場合、分布を適切に表現できない可能性があること、および (2) 既存のデータ セットの最大値よりも大きな値を生成できないことです。

これらを超えるには、上記のガンマ分布のようなパラメトリック分布を見る必要があります。

于 2012-07-02T22:14:38.590 に答える
1

正規分布には、平均と分散の 2 つのパラメーターしかありません。正規分布の拡張には、4 つのパラメーターがあり、さらに歪度と尖度が追加されています。1 つの例は Gram-Charlier 展開ですが、私が覚えている限り、scipy では rvs ではなく pdf のみが利用可能です。

別の方法として、scipy.stats には johnsonsu のような 4 つのパラメーターを持つディストリビューションがあります。これらは柔軟ですが、パラメーター化が異なります。

ただし、あなたの例では、分布はゼロより大きい値であるため、ほぼ正規分布はうまく機能しません。アンドリューが提案したように、ガンマのようにゼロの下限を持つ scipy.stats の分布を調べる必要があると思います。近いものが見つかるかもしれません。

別の方法として、サンプルが十分に大きい場合は、乱数を作成できる gaussian_kde を使用することもできます。しかし、gaussian_kde は、有限の境界を持つ分散用にも設計されていません。

于 2012-03-25T17:06:43.223 に答える
0

短い回答 必要に応じて他のディストリビューションに置き換えます:

n = 100
a_b = [rand() for i in range(n)]
a_b.sort()
# len(a_b[:int(n*.8)])
c = a_b[int(n*.8)]
print c
于 2014-09-09T13:44:36.127 に答える
0

誤解しているかもしれませんが、私は確かに統計の専門家ではありませんが、あなたの画像はかなりガンマ分布に似ています。

Scipy にはガンマ分布専用のコードが含まれています - http://www.scipy.org/doc/api_docs/SciPy.stats.distributions.html#gamma

于 2012-03-25T08:07:28.240 に答える