、ちょうど私がnumpyの持ついくつかの統計上のブートストラップ誤差推定を行うにしようとしています下の水平線NumPyで大規模な配列を何回も効率的にサンプリングする方法はありますか?あなたは私が実装しようとしているかの詳細については気にしない場合は
をスキップ。私は配列x
を持っていて、誤差分析の通常のガウス仮説が成立しない統計量f(x)
の誤差を計算したいと考えています。 x
は非常に大きいです。これを行うには
、私は私の再サンプルのサイズは、交換して、元の配列の大きさであるnumpy.random.choice()
を、使用してx
をリサンプル:
resample = np.random.choice(x, size=len(x), replace=True)
これは私にx
の新しい実現を与えます。この操作は、正確な誤差の推定値を得るために約1000回繰り返さなければならない。私がこのような性質のリサンプルを1000回生成した場合、
resamples = [np.random.choice(x, size=len(x), replace=True) for i in range(1000)]
し、各実現に統計f(x)
を計算します。
results = [f(arr) for arr in resamples]
その後、私はたとえf(x)
自体はガウスエラー解析、分布を用いて記述することができないということでアイデア
np.std(results)
のようなものであることをf(x)
のエラーが推測されていますf(x)
ランダムエラーの措置のはすることができます。
これはブートストラップです。さて、私の問題は、ライン
resamples = [np.random.choice(x, size=len(x), replace=True) for i in range(1000)]
が大きな配列のため非常に遅いことです。リストの理解なしにこれを行うよりスマートな方法はありますか?第二のリストの内包表記
results = [f(arr) for arr in resamples]
は機能f(x)
の内容によっては、あまりにもかなり遅くなることがあります。
サブサンプルの構築を避けるために私が使ってきたアプローチは、対応するデータムがサンプルに含まれている場合は1、そうでない場合は0のフラグ配列を代わりに作成することです。サブサンプルを作成することは、フラグを置換することを意味します。サブサンプル配列の割り当てと塗りつぶしが計算時間のかなりの部分である場合、フラグを使った作業は勝利です。 –
@RobertDodierありがとう!これは、以下のDivakarの答えと非常によく似ていますが、インデックス作成ではなく配列マスキングを使用しています。私はそれらのどれが速くなるかわからない - それは同じだろう、私は思うだろう。 – Anonymous
はい、単にインデックスのリストを使用することは同等であり、データを含める/除外するだけの方が簡単かもしれません。私はしばしば1や0以外のウェイトを必要としていました。他のものよりもいくつかのデータ(例えば、データ内に少数の例を有するクラス)を置き換えて、または強調してサンプリングを表すために、重み> 1を使用する。 0/1以外のウェイトが必要ない場合は、インデックスのリストを使用することができます。 –