Python を使用した加重ランダム選択

Lakshay Kapoor 2023年10月10日
  1. random.choices() 関数を使用して、重み付きランダム選択を生成する
  2. numpy.random.choice() 関数を使用して、重み付きランダム選択を生成する
Python を使用した加重ランダム選択

Python では、Random ライブラリと NumPy ライブラリを使用して乱数を簡単に生成できます。

要素の予想される結果によってリストまたは配列からランダムな要素を選択することは、加重ランダム選択として知られています。要素の選択は、存在する各要素に確率を割り当てることによって決定されます。作成された要素のリストから複数の要素が選択されることもあります。

このチュートリアルでは、Python で重み付きランダム選択を生成する方法について説明します。

random.choices() 関数を使用して、重み付きランダム選択を生成する

ここでは、Python の random モジュールを使用して乱数を作成します。

choices() 関数では、置換によって重み付けされたランダムな選択が行われます。これは、置換を伴う加重ランダムサンプルとしても知られています。また、この関数では、重みが重要な役割を果たします。重みは、各要素の選択の予想される結果を定義します。ウェイトには 2つのタイプがあります。

  1. 相対的な重み
  2. 累積重み

相対的な重みを持つ要素を選択する

weights パラメーターは、相対的な重みを定義します。予想される結果は、リスト内の要素ごとに異なります。各要素の予想される結果が相対的な重みを使用して修正されている場合、選択は相対的な重みのみに基づいて行われます。

次に例を示します。

import random

List = [12, 24, 36, 48, 60, 72, 84]
print(random.choices(List, weights=(30, 40, 50, 60, 70, 80, 90), k=7))

ここでは、リスト内の各要素に独自の重み、つまり予想される結果が与えられています。また、上記の例の k は、指定されたリストから必要な要素の数です。

出力:

[60, 84, 36, 72, 84, 84, 60]

ここでは、重みは相対的な重みであり、パーセンテージではないため、重みの合計は 100 ではありません。84 という数字は、すべての重みの中で最も重みが高いため、3 回発生しています。したがって、その発生の可能性が最も高くなります。

累積重みのある要素を選択する

cum_weight パラメーターは、累積重みを定義するために使用されます。要素の累積重量は、前の要素の重量にその要素の相対重量を加えたものによって決定されます。たとえば、相対的な重み [10、20、30、40]は、累積的な重み [10、30、60、100]と同等です。

次に例を示します。

import random

List = [13, 26, 39, 52, 65]
print(random.choices(List, cum_weights=(10, 30, 60, 100, 150), k=5))

出力:

[65, 65, 39, 13, 52]

ここでも、65 という数字は、重みが最も高いため、他のどの数字よりも多く発生します。

numpy.random.choice() 関数を使用して、重み付きランダム選択を生成する

ランダムに重み付けされた選択肢を生成するために、ユーザーが 3.6 未満の Python バージョンを使用している場合、NumPy は一般的に使用されます。

ここでは、numpy.random.choice を使用して確率分布を決定します。このメソッドでは、1D 配列のランダムな要素が取得され、choice() 関数を使用して numpy 配列のランダムな要素が返されます。

import numpy as np

List = [500, 600, 700, 800]
sNumbers = np.random.choice(List, 4, p=[0.10, 0.20, 0.30, 0.40])
print(sNumbers)

ここで、確率は 1 に等しくなければなりません。数字の 4 は、リストのサイズを表します。

出力:

[800 500 600 800]
著者: Lakshay Kapoor
Lakshay Kapoor avatar Lakshay Kapoor avatar

Lakshay Kapoor is a final year B.Tech Computer Science student at Amity University Noida. He is familiar with programming languages and their real-world applications (Python/R/C++). Deeply interested in the area of Data Sciences and Machine Learning.

LinkedIn

関連記事 - Python Random