اذهب إلى المحتوى
  • 0

عمل دالة مشابهة لـ random.choice مع وجود احتمالية معينة لكل عنصر في بايثون

Fahmy Mostafa

السؤال

أحاول أن أقوم بعمل دالة بديلة لدالة random.choice وتقبل الدالة قائمة العناصر وقائمة الاحتمالات كالتالي:

lst= [1, 2, 3, 4]
choice(lst, [0.2, 0.2, 0.4, 0.2])

وبذلك يمكن أن يكون لكل عنصر فرصة (احتمالية) مختلفة ليتم اختياره.

كيف أقوم بعمل مثل هذه الدالة في بايثون؟ هل توجد دالة جاهزة تقوم بهذا الأمر؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

هناك طريقتان لإجراء اختيارات عشوائية بإستعمال إحتمالات إختيار لكل عنصر في بايثون:

  • إذا كنت تستخدم Python 3.6 أو أعلى ، فاستخدم ()random.choices
  • عدا ذلك ، استخدم ()numpy.random.choice

random.choices:

قدم Python 3.6 دالة جديدة random.choices  في الوحدة العشوائية. باستخدامها يمكننا إجراء اختيار عشوائي مرجح مع الاستبدال. يمكنك أيضًا تسميتها عينة عشوائية مرجحة مع الاستبدال.

توقيع الدالة كالتالي:

random.choices(population, weights=None, *, cum_weights=None, k=1)

تقوم بإرجاع قائمة بحجم k للعناصر المختارة من المجتمع (population)

  • population: هي بنية التسلسل أو البيانات التي تريد الإختيار منها
  • weights أو cum_weights: لتحديد احتمال الاختيار لكل عنصر.
  • k: عدد العينات التي تريدها من المجتمع (population)

ملاحظة: لا يُمكنك تحديد كل من weights و cum_weights في نفس الوقت بل يجب تحديد أحدهما و إن لم يتم تحديد أحدهما ستكون كل العناصر لديها نفس إحتمال الإختيار. عدد العناصر المُحددة في سلسلة الأوزان يجب أن يكون نفس عدد عناصر المُجتمع (population)، تستطيع إستخدام الأعداد الصحيحة (integers) الغير سالبة او floats في الأوزان، الأوزان يجب أن لا تكون سالبة.

مثال: اختيار 5 عناصر من القائمة باحتمالات مختلفة

import random

numberList = [1, 2, 3, 4, 5]
print(random.choices(numberList, weights=(10, 20, 30, 40, 50), k=5))
# Output [5, 5, 4, 5, 4]

ملاحظة: 

  • كما ترى في الخرج ، تلقينا العُنصر "5" ثلاث مرات لأننا خصصنا له أعلى وزن. لذلك فإن لديها أعلى احتمالية ليتم اختيارها
  • مجموع الأوزان ليس 100 لأنها أوزان نسبية وليست نسبًا.

حيث أن الإحتمال لكل عُنصر يُحسب كالتالي: وزن العُنصر / مجموع الأوزان.

إذا أردنا إرجاع عُنصر واحد فقط سنُحدد k بواحد لكن ناتج الدالة سيكون قائمة تتكون من عنصر واحد.

إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال:

import random

numberList = [1, 2, 3, 4]

def choice(population, w):
    return random.choices(population, weights=w, k=1)[0]

print(choice(numberList, (0.2, 0.2, 0.4, 0.2)))

إستخدام مكتبة numpy:

لتثبيت المكتبة: pip install numpy

توقيع الدالة المُستخدمة كالتالي:

numpy.random.choice(a, size=None, replace=True, p=None)

حيث a هو المجتمع أو مصدر البيانات، size هو عدد العناصر التي نريد إختيارها، و p يُستخدم لوضع إحتمالات الإختيار.

ملاحظة: يجب ان يكون مجموع الإحتمالات هو 1.

إذا أردت إنشاء الدالة التي تريدها بإستخدام هذه الطريقة يُمكنك ذلك من خلال:

import numpy as np

numberList = [1, 2, 3, 4]

def choice(a, w):
    return np.random.choice(a, p=w)

print(choice(numberList, [0.1, 0.6, 0.2, 0.1]))

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

يمكن الاستعانة بالمكتبة numpy ثم استدعاء الدالة choice من random:

numpy.random.choice(numpy.arange(1, 6), p=[0.3, 0.15, 0.25, 0.2, 0.1])
  • تم تمرير مصفوفة بطول 6 تم توليدها من خلال arange التي هي array of range كمعامل أول ل choice ثم قائمة بالاحتمالات لكل عنصر بالترتيب
  • طول قائمة الاحتمالات بنفس عدد الأعداد المكونة.
  • لاحظ أن مجموع الاحتمالات يساوي 1.
رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...