تصادفی بودن، بخش مهمی از «پیکربندی» (Configuration) و «ارزیابی» (Evaluation) الگوریتم‌های «یادگیری ماشین» (Machine Learning) را تشکیل می‌دهد. از مقداردهی اولیه تصادفی وزن‌ها در «شبکه عصبی مصنوعی» (Artificial Neural Network) تا بخش‌بندی داده‌ها به صورت تصادفی به دو دسته «مجموعه تست» (Test Set) و «مجموعه آموزش» (Train Set) و همچنین، «برُ زدن تصادفی» (Random Shuffling) مجموعه داده تست در «گرادیان نزولی تصادفی»، همه و همه نیاز به تسلط بر مهارت تولید اعداد تصادفی و استفاده از تصادفی بودن دارند. در این مطلب، روش تولید اعداد تصادفی در پایتون مورد بررسی قرار خواهد گرفت. در ادامه، مباحث زیر بررسی خواهند شد:

  • تصادفی بودن، با استفاده از «مولدهای اعداد شبه تصادفی» (Pseudorandom Number Generators) قابل اعمال در برنامه‌ها است.
  • روش تولید اعداد تصادفی و استفاده از تصادفی بودن با استفاده از کتابخانه‌های استاندارد «زبان برنامه‌نویسی پایتون» (Python Programming Language) شرح داده می‌شود.
  • روش تولید آرایه‌هایی از اعداد تصادفی با کتابخانه «نام‌پای» (NumPy) شرح داده می‌شود.

مفاهیم بیان شده، در سه بخش کلی مولدهای اعداد شبه تصادفی، اعداد تصادفی با پایتون و اعداد تصادفی با «نام‌پای» (NumPy) شرح داده می‌شوند.

مولدهای اعداد شبه تصادفی

منبع تصادفی بودنی که در برنامه‌ها و الگوریتم‌ها تزریق می‌شود، ترفند ریاضیاتی است که مولد اعداد تصادفی نامیده می‌شود. مولد اعداد تصادفی، سیستمی است که اعداد تصادفی را از یک منبع درست از تصادفی بودن تولید می‌کند. معمولا، یک ابزار اندازه‌گیری پدیده فیزیکی مانند «شمارشگر گایگر مولر» (Geiger-Müller Counter)، جایی است که نتایج به اعداد تصادفی مبدل می‌شوند. در یادگیری ماشین، به تصادفی بودن نیازی نیست. بلکه، از اعداد «شبه تصادفی» (Pseudorandom) استفاده می‌شود. اعداد شبه تصادفی، نمونه‌ای از اعداد محسوب می‌شوند که بسیار شبیه به اعداد تصادفی هستند، اما با استفاده از یک فرایند قطعی تولید شده‌اند.

در بُر زدن داده‌ها و مقداردهی اولیه ضرایب با مقادیر تصادفی از  مولدهای اعداد شبه تصادفی استفاده می‌شود. این برنامه‌های کوچک، اغلب توابعی هستند که پس از فراخوانی شدن، یک عدد تصادفی را باز می‌گردانند. در صورت فراخوانی مجدد، این برنامه‌ها یک عدد تصادفی جدید را باز می‌گردانند. توابع پوششی (Wrapper Functions) نیز موجود هستند و به کاربر این امکان را می‌دهند که عدد تصادفی را به صورت «عدد صحیح» (Integer)، «ممیز شناور» (Floating Point)، با یک توزیع احتمالی خاص و یا در یک طیف خاص دریافت کند.

ارقام مربوط به اعداد تصادفی طبق یک توالی ایجاد می‌شوند. توالی قطعی است و با یک مقدار اولیه «دانه» (seed) آغاز می‌شود. اگر کاربر صراحتا به مولد اعداد تصادفی دانه ندهد، امکان دارد مولد از زمان سیستم به ثانیه یا میلی‌ثانیه به عنوان دانه استفاده کند. مقدار دانه اهمیتی ندارد. کاربر می‌تواند هر آنچه می‌خواهد را انتخاب کند. آنچه اهمیت دارد این است که دانه دادن یکسان به فرایند، منجر به توالی مشابهی از اعداد تصادفی می‌شود. در ادامه، مثال‌هایی در این مورد ارائه می‌شوند.

تولید اعداد تصادفی با پایتون

کتابخانه استاندارد پایتون، ماژولی با عنوان random فراهم می‌کند که دارای دسته‌ای از توابع برای تولید اعداد تصادفی است. پایتون از یک مولد اعداد تصادفی مستحکم و محبوب به نام Mersenne Twister بهره می‌برد که یک توالی از اعداد تقریبا تصادفی را تولید می‌کند. این مولد، پارامتری را برای آغاز توالی دریافت می‌کند که «دانه» (seed) نامیده می‌شود. تابع قطعی است، بدین معنا که دادن یک دانه مشابه، هر بار منجر به تولید توالی مشابهی از اعداد می‌شود. انتخاب دانه اهمیتی ندارد.

تابع ()seed به مولد اعداد تصادفی، دانه می‌دهد و یک عدد صحیح مانند ۱ یا ۷ را به عنوان آرگومان دریافت می‌کند. اگر تابع ()seed پیش از استفاده از تابع تصادفی بودن فراخوانی نشود، به طور پیش‌فرض، از زمان سیستم به میلی‌ثانیه از مبدا تاریخ موجود در بایوس (۱۹۷۰) برای تولید اعداد تصادفی استفاده می‌شود. مثال زیر، چگونگی دانه دادن به مولد عدد تصادفی را نشان می‌دهد که بر اثر آن، اعداد تصادفی تولید می‌شوند. همچنین، نشان می‌دهد که دانه دادن مجدد به مولدها منجر به تولید توالی مشابهی از اعداد تصادفی می‌شود.

با اجرای مثال بالا، به مولد اعداد تصادفی دانه با مقدار ۱ داده می‌شود؛ مولد، ۳ عدد تصادفی تولید می‌کند، مجددا به مولد دانه داده می‌شود و همانطور که مشهود است، سه عدد تصادفی مشابه تولید می‌شوند.

تنظیم کردن دانه، برای کنترل تصادفی بودن و حصول اطمینان از اینکه کد هر بار از توالی مشابهی استفاده می‌کند، درست مانند مدل تولید، بسیار مفید خواهد بود. برای اجرای آزمایش‌هایی که در آن‌ها تصادفی بودن برای کنترل متغیرهای مداخله‌گر مورد استفاده قرار می‌گیرد، امکان دارد یک دانه متفاوت برای هر اجرای آزمایشی مورد استفاده قرار بگیرد.

مقادیر ممیز شناور تصادفی

مقادیر ممیز شناور تصادفی، با استفاده از تابع ()random قابل استفاده هستند. مقادیر در بازه بین صفر و یک و به ویژه در بازه (0,1] تولید می‌شوند. مقادیر از یک «توزیع یکنواخت» (Uniform Distribution) حاصل می‌شوند، بدین معنا که هر مقدار دارای شانس برابری برای تولید شدن دارد. مثال زیر، ۱۰ مقدار تصادفی ممیز شناور را تولید می‌کند.

با اجرای قطعه کد بالا، مقادیر تصادفی ممیز شناور، تولید و چاپ می‌شوند.

0.1343642441124012
0.8474337369372327
0.763774618976614
0.2550690257394217
0.49543508709194095
0.4494910647887381
0.651592972722763
0.7887233511355132
0.0938595867742349
0.02834747652200631

مقادیر ممیز شناور را می‌توان با ضرب کردن آن‌ها با اندازه دامنه تغییرات (range) و افزودن مقدار کمینه (min) به آن، تغییر مقیاس داد.

در کد بالا، min و max، به ترتیب مقادیر کمینه و بیشینه از یک طیف دلخواه هستند، و value‌ مقداری است که توسط روند تولید اعداد تصادفی در فاصله ۰ تا ۱ تولید شده است.

اعداد صحیح تصادفی

مقادیر صحیح تصادفی را می‌توان با تابع ()randint تولید کرد. این تابع، دو آرگومان دریافت می‌کند؛ شروع و پایان طیف برای مقادیر صحیح تولید شده، دو آرگومان دریافتی هستند. اعداد صحیح تصادفی در طیف مقادیر شروع و پایان و با احتساب خود این مقادیر (بازه بسته [start, end]) تولید می‌شوند. مثال زیر، ۱۰ عدد تصادفی را بین ۰ و ۱۰ تولید می‌کند.

با اجرای قطعه کد بالا، ده عدد تصادفی صحیح تولید می‌شود.

تولید اعداد گاوسی تصادفی

مقادیر ممیز شناور تصادفی را می‌توان از یک توزیع گاوسی با استفاده از تابع ()gauss ایجاد کرد. این تابع، دو آرگومانی که متناظر با پارامترهای توزیع نرمال (گاوسی) یعنی میانگین و انحراف معیار هستند را دریافت می‌کند.. مثال زیر، ۱۰ عدد تصادفی از توزیع گاوسی را با میانگین ۰.۰ و انحراف معیار ۱.۰ تولید می‌کند. توجه به این نکته لازم است که این پارامترها محدودیتی روی مقادیر ایجاد نمی‌کنند و توزیع مقادیر بر اساس شکل زنگی (زنگوله‌ای)، توزیع کنترل می‌شود؛ از آنجایی که شکل توزیع نرمال، متقارن است، برای مقادیر مثبت و منفی (بزرگتر و کوچکتر از صفر) احتمال تولید عدد تصادفی یکسان است.

با اجرای قطعه کد مثال بالا، ۱۰ مقدار گاوسی تصادفی ایجاد می‌شود.

1.2881847531554629
1.449445608699771
0.06633580893826191
-0.7645436509716318
-1.0921732151041414
0.03133451683171687
-1.022103170010873
-1.4368294451025299
0.19931197648375384
0.13337460465860485

انتخاب تصادفی از یک لیست

اعداد تصادفی برای انتخاب تصادفی یک آیتم از لیست نیز قابل استفاده هستند. برای مثال، اگر یک لیست از حروف a, b, c, d در اختیار داشته باشیم و بخواهیم به شکل تصادفی یک کلمه ۱۰ حرفی (با جایگذاری) ایجاد کنیم از تابع ()choice استفاده خواهیم کرد. انتخاب‌ها با «توزیع یکنواخت» (Uniform Likelihood) انجام می‌شوند. قطعه کدی که در زیر آمده، این کار را انجام داده است و حروف مربوط به یک کلمه ۱۰ حرفی را از لیست حروف داده شده، ایجاد کرده است.

با اجرای مثال بالا، ابتدا یک لیست از مقادیر صحیح چاپ می‌شود، سپس، پنج مقدار تصادفی از میان آیتم‌های این لیست انتخاب و چاپ می‌شوند. البته از آنجایی مقدار (1)seed داده شده، با تکرار برنامه همین حروف ایجاد خواهد شد.

زیرنمونه تصادفی از یک لیست

کاربر ممکن است تمایل به تکرار فرایند انتخاب مقادیر تصادفی از لیست داشته باشد تا یک زیرمجموعه انتخاب شده به صورت تصادفی بسازد. مهم‌تر آنکه، هنگامی که یک عنصر از لیست انتخاب و به زیر مجموعه اضافه شد، مجددا نباید اضافه شود. به این کار، انتخاب بدون جایگذاری گفته می‌شود، زیرا هنگامی که یک عنصر از لیست برای زیر مجموعه انتخاب شد، مجددا به لیست اصلی اضافه نمی‌شود (برای انتخاب مجدد موجود نیست). این رفتار، توسط تابع ()sample ارائه می‌شود که طی آن، لیست و اندازه زیرمجموعه به select به عنوان آرگومان داده می‌شود. توجه به این نکته لازم است که آیتم‌ها از لیست اصلی حذف نشده‌اند، بلکه، تنها در یک کپی از لیست انتخاب شده‌اند. مثال زیر چگونگی انتخاب یک زیر مجموعه حاوی سه عنصر را از لیستی حاوی چهار حرف اولی لاتین، نشان می‌دهد.

با اجرای قطعه کد بالا، ابتدا یک لیست از مقادیر صحیح چاپ و سپس، یک نمونه تصادفی از آن انتخاب و چاپ می‌شود.

بُر زدن تصادفی یک لیست

از تصادفی بودن می‌توان برای بُر زدن تصادفی یک لیست از عناصر مانند بُر زدن ورق‌های بازی استفاده کرد. از تابع ()shuffle می‌توان برای انجام این کار، استفاده کرد. shuffle داده‌ها را در جای خودشان بُر می‌زند، بدین معنا که لیست به عنوان یک آرگومان برای تابع ()shuffle ارائه، بر زده و باز گردانده می‌شود. در حقیقت این تابع لیست بر زده شده را به جای کپی در یک لیست جدید، به شکل درجا ایجاد می‌کند. مثال زیر چگونگی بر زدن تصادفی یک لیست از اعداد صحیح را نشان می‌دهد. همانطور که می‌بینید تابع (shuffle(sequence به متغیر دیگری نسبت داده نشده و حاصل اجرای این تابع (یعنی بُر زدن) در همان لیست sequence دیده خواهد شد.

با اجرای مثال بالا، یک لیست از اعداد صحیح چاپ می‌شود، سپس همان لیست به صورت تصادفی بُر می‌خورد.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[11, 5, 17, 19, 9, 0, 16, 1, 15, 6, 10, 13, 14, 12, 7, 3, 8, 2, 18, 4]

تولید اعداد تصادفی با نام‌پای

در یادگیری ماشین، از کتابخانه‌هایی مانند «سایکیت‌لِرن» (Scikit-Learn) و «کرس» (Keras) استفاده می‌شود. این کتابخانه‌ها مبتنی بر «نام‌پای» (NumPy) هستند و در واقع، از کتابخانه نام‌پای در پس خود استفاده می‌کنند. NumPy کتابخانه‌ای است که قادر به انجام محاسبات بسیار کارآمد روی بردارها و ماتریس‌ها است. نام‌پای، پیاده‌سازی اختصاصی از مولد اعداد تصادفی را بوسیله توابع پوششی دارد. همچنین، این کتابخانه مولد اعداد شبه‌تصادفی Mersenne Twister را پیاده‌سازی می‌کند. در ادامه، مثال‌هایی پیرامون تولید اعداد تصادفی و استفاده از تصادفی بودن با آرایه‌های NumPy ارائه می‌شود.

سید دادن به مولد اعداد تصادفی

مولد اعداد تصادفی NumPy از کتابخانه استاندارد پایتون متفاوت است. مهم‌تر آنکه، دانه دادن به مولد اعداد شبه‌تصادفی پایتون، مولد اعداد تصادفی NumPy را تحت تاثیر قرار نمی‌دهد. این دو باید به طور جداگانه دانه داده و استفاده شوند. تابع ()seed را می‌توان برای دانه دادن به مولد اعداد شبه تصادفی NumPy استفاده کرد که یک مقدار صحیح را به عنوان دانه دریافت می‌کند. مثال زیر نشان می‌دهد که چگونه به مولد دانه داده می‌شود و چطور، دانه دادن مجدد مولد منجر به توالی مشابهی از اعداد تصادفی تولید شده می‌شود.

با اجرای قطعه کد بالا، به مولد اعداد شبه تصادفی دانه داده می‌شود و یک توالی از اعداد تصادفی چاپ می‌شود؛ سپس، مجددا به مولد دانه داده می‌شود و دقیقا اعداد تصادفی مشابهی با آنچه پیش‌تر تولید شده بود، نمایش داده می‌شوند.

[4.17022005e-01 7.20324493e-01 1.14374817e-04]
[4.17022005e-01 7.20324493e-01 1.14374817e-04]

آرایه‌ای از اعداد ممیز شناور تصادفی

یک آرایه از مقادیر ممیز شناور تصادفی را می‌توان با استفاده از تابع نام‌پای ()rand تولید کرد. اگر هیچ آرگومانی فراهم نشود، یک مقدار تصادفی مجرد ساخته می‌شود، در غیر این صورت، اندازه آرایه را می‌توان تعیین کرد. مثال زیر، یک آرایه از ۱۰ عدد تصادفی ممیز شناور با توزیع یکنواخت می‌سازد.

با اجرای قطعه کد بالا، آرایه نام‌پای از اعداد تصادفی ممیز شناور تولید و چاپ می‌شود.

[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01
1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01
3.96767474e-01 5.38816734e-01]

آرایه‌ای از مقادیر صحیح تصادفی

یک آرایه از مقادیر تصادفی صحیح را می‌توان با استفاده از تابع پایتون ()randint تولید کرد. این تابع، سه آرگومان کمترین مقدار بازه، بیشترین مقدار بازه و تعداد اعداد صحیح یا اندازه آرایه اعداد صحیح را دریافت می‌کند. اعداد صحیح از یک توزیع یکنواخت از کمترین مقدار تا بیشترین مقدار بازه پیروی می‌کنند (بازه به صورت (lower, upper] که شامل مقدار upper نیست). در مثال زیر، چگونگی ساختن یک آرایه از اعداد صحیح تصادفی نشان داده شده است.

با اجرای قطعه کد بالا، آرایه‌ای شامل ۲۰ عدد صحیح بین ۰ و ۱۰ ساخته می‌شود.

 [5 8 9 5 0 0 1 7 6 9 2 4 5 2 4 2 4 7 7 9]

آرایه‌ای از مقادیر تصادفی گاوسی

یک آرایه از مقادیر گاوسی تصادفی را می‌توان با استفاده از تابع ()randn نام‌پای ساخت. این تابع یک آرگومان یکتا را به منظور تعیین اندازه آرایه حاصل شده دریافت می‌کند. مقادیر گاوسی از توزیع استاندارد گاوسی گرفته شده‌اند؛ این توزیع دارای میانگین ۰.۰ و انحراف معیار ۱.۰ است. قطعه کد زیر، نشان می‌دهد که چطور می‌توان یک آرایه از اعداد تصادفی گاوسی را تولید کرد.

با اجرای قطعه کد بالا، یک آرایه از ۱۰ مقدار تصادفی از توزیع استاندارد گاوسی تولید می‌شود.

[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763 -2.3015387
1.74481176 -0.7612069 0.3190391 -0.24937038]

مقادیر حاصل از توزیع استاندارد گاوسی را می‌توان با ضرب کردن در انحراف معیار و اضافه کردن میانگین به یک توزیع گاوسی با میانگین و انحراف معیار دلخواه، تغییر مقیاس داد.

در قطعه کد بالا، mean  و stdev، میانگین و انحراف معیار برای یک توزیع گاوسی دلخواه هستند و value مقدار حاصل از تولید عدد تصادفی با توزیع استاندارد گاوسی است. محاسبه صورت گرفته باعث ایجاد یک عدد تصادفی از توزیع گاوسی با میانگین mean و انحراف استاندارد stdev خواهد شد.

بُر زدن آرایه نام‌پای

یک آرایه نام‌پای را می‌توان به صورت تصادفی در جای خود (بدون تهیه یک کپی از لیست) با استفاده از تابع ()shuffle نام‌پای بُر زد. مثال زیر نشان می‌دهد که چگونه می‌توان یک آرایه نام‌پای را بُر زد.

با اجرای قطعه کد بالا، ابتدا لیستی حاوی ۲۰ عدد صحیح ساخته می‌شود و سپس، همان آرایه بُر زده و چاپ می‌شود.

جمع‌بندی

در این راهنما، چگونگی تولید اعداد تصادفی و کار با آن‌ها در زبان برنامه‌نویسی پایتون شرح داده شد. یکی از مباحثی که در این مطلب بیان شد، این است که اعداد تصادفی در برنامه‌ها با استفاده از مولد اعداد تصادفی تولید می‌شوند. همچنین، چگونگی تولید اعداد تصادفی و استفاده از آن‌ها با کتابخانه استاندارد پایتون تشریح شد. در پایان، چگونگی تولید آرایه‌ای از اعداد تصادفی با استفاده از کتابخانه نام‌پای مورد بررسی قرار گرفت.

اگر مطلب بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

telegram
twitter

الهام حصارکی

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.

بر اساس رای 1 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *