2016-07-14 12 views
2

私は正規分布を持ち、それから1000回サンプリングしたいとします。値が上位20パーセンタイルにある場合は、カウンタに1を加算したいとします。これに最適なソリューションは何ですか?ランダム確率分布確率分布から一定数

私はnumpyを使ってこれを解決しようとしており、その背後にある数学を理解することはできません。今、私はこれを持っているが、それは数学的に行うことができるような気がします:

import numpy as np 
s = np.random.normal(0, 1, 1000) 
sum([val for val in s if val > np.percentile(s, 80)]) 
+0

理論的に20パーセンタイルか実験的なものか? – MBo

+0

具体的にどこに問題がありますか?表示するコードはありますか?これは今のところ問題ではなく、これ以上の仕事です。 – sytech

答えて

1

mu = 0 
std = 1 
arr = np.random.normal(mu, std, 1000) 

これがあなたに与えます上位20パーセンタイルの項目数:

arr[arr > np.percentile(arr, 80)].size 
Out[30]: 200 

編集:あなたのコードも素敵です。しかし、値を合計したくない場合は、それらを数えたいと思います。だから、いつでもval > np.percentile(s, 80)あなたは1のを合計する:

sum([1 for val in s if val > np.percentile(s, 80)]) 
Out[35]: 200 

しかしこれはnumpyのの方法よりも遅くなります。

+0

FYI: 'arr = mu + std * np.random.randn(1000)'を 'arr = np.random.normal(mu、std、1000)'に置き換えることができます。 –

+0

@WarrenWeckesserそれは良いです。ありがとうございました。 – ayhan

1

あなたが正規分布を持っている場合は、私がそうでなければ、この質問には、いくつかの余分な後処理を必要とし、あなたがmusigmaを知っていると仮定します。あなたは取り出した各要素に対して特定のZ=(X-mu)/sigmaを持っています。あなたの20パーセンタイルはXとなり、Z>0.842となります。

のようにあなたが何かを行うことができます。これは、生成された配列(あなたは平均値と標準偏差と遊ぶことができる、彼らはデフォルトのものです)です

if Z_val(x, mu, sigma) > 0.842: counter+=1 
関連する問題