ランダムにサンプルを採取しようとしている12個のユニークなグループがあり、それぞれ異なる数の観測値があります。私は、集団全体(データフレーム)から無作為にサンプルを採り、各グループは同じ確率で選択されたいと思っています。これの最も簡単な例は、2つのグループを持つデータフレームです。ランダムに選択する確率が等しい - 予期しない動作
(1./num_groups)/size_of_groups
:
np.random.choice(df['groups'], p=df['probability'], size=100)
を使用して
groups probability
0 a 0.25
1 a 0.25
2 b 0.5
は、各反復は、今、私が式を使用確率を思い付くgroup a
を選択する確率が50%とgroup b
を選択する50%のチャンスがあります
またはPythonで:
num_groups = len(df['groups'].unique()) # 2
size_of_groups = df.groupby('label').size() # {a: 2, b: 1}
(1./num_groups)/size_of_groups
返す
groups
a 0.25
b 0.50
これは私が奇妙なディストリビューションを取得する前に10のユニークなグループを取得するまで素晴らしいです。ここで小さな例です:
np.random.seed(1234)
group_size = 12
groups = np.arange(group_size)
probs = np.random.uniform(size=group_size)
probs = probs/probs.sum()
g = np.random.choice(groups, size=10000, p=probs)
df = pd.DataFrame({'groups': g})
prob_map = ((1./len(df['groups'].unique()))/df.groupby('groups').size()).to_dict()
df['probability'] = df['groups'].map(prob_map)
plt.hist(np.random.choice(df['groups'], p=df['probability'], size=10000, replace=True))
plt.xticks(np.arange(group_size))
plt.show()
私は十分に大きなサンプルサイズでかなり均一な分布を期待するだろうが、グループの数は11+であるとき、私はこれらの翼を取得しています。 group_size
変数を10以下に変更すると、希望の一様分布が得られます。
問題の計算式が浮動小数点精度問題かどうかはわかりませんが、誰でも、これを達成するためのよりよい方法、またはこの例の修正を知っていますか?
ありがとうございます!
理にかなってああ、:代わりに、これを試してみてください!早速のお返事ありがとうございます! – pyrate