عدد رندوم چگونه عددی است؟ برای آن که بتوانیم بحث را پیش ببریم، بهتر است ابتدا درک درستی از مفهوم عدد رندوم داشته باشیم. رایانهها بر اساس الگوریتمهای مختلفی کار میکنند؛ هر الگوریتم نیز مجموعهای از کارهای مشخص و ترتیبمند است. ساخت اعداد رندوم نیز در رایانه با استفاده از الگوریتمهایی انجام میشود و فرایندی کاملا مشخص است. اگر برنامهای وجود دارد که میتواند بر اساس الگوریتمی عدد رندوم بسازد، پس خروجی این برنامه که همان عدد رندوم است قابل پیشبینی است. به چنین اعداد رندومی که بر اساس الگوریتمهای رایانهای ساخته میشوند، شبه رندوم (Pseudo Random) گفته میشود. در ادامه پس از آن که معرفی کاملی از اعداد رندوم در نامپای داشتیم، به معرفی انواع توزیع های احتمال میپردازیم.
آیا میتوان با استفاده از کامپیوتر، اعداد واقعا رندوم ساخت؟
بله امکانپذیر است. برای آن که با استفاده از کامپیوتر بتوانیم اعداد واقعا رندوم بسازیم، نیاز است تا یک دادهی رندوم را از خارج از رایانه وارد کنیم؛ این منابع خارجی میتوانند حرکت ماوس، اطلاعات موجود در وب یا … باشد. ما در کارهای رایجی که انجام میدهیم، به اعداد واقعا رندوم نیازی نداریم؛ مگر آن که این اعداد را به منظور استفاده در رمزنگاری یا موارد خاص دیگری بخواهیم. در ادامه هر جایی که از عدد رندوم حرف میزنیم، منظور عدد شبه رندوم است.
ساخت اعداد رندوم صحیح در پایتون با استفاده از numpy
در numpy یک ماژول به نام random وجود دارد که برای کار با اعداد رندوم ساخته شده است. با استفاده از تابع randint از این ماژول میتوان عدد رندوم صحیح ساخت. عدد رندوم ساخته شده در کد زیر، کمتر از آرگومان ورودی آن است:
1 2 3 4 5 |
from numpy import random x = random.randint(100) print(x) |
ساخت اعداد رندوم حقیقی در پایتون با استفاده از numpy
با استفاده از تابع rand میتوان اعداد رندوم بین صفر و یک در پایتون ساخت. به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.rand() print(x) |
ساخت یک آرایه با اعداد تصادفی
با استفاده از دو متد ذکرشده در بالا یعنی rand و randint میتوان آرایهای از اعداد صحیح ساخت. متد randint یک آرگومان اختیاری با نام size میگیرد که همان shape یا فرم آرایه است. متد rand نیز، فرم آرایه را به عنوان ورودی میگیرد. به مثالهای زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.randint(100, size=(3, 5)) print(x) |
1 2 3 4 5 |
from numpy import random x = random.rand(3, 5) print(x) |
انتخاب تصادفی عناصر آرایه با استفاده از numpy
با استفاده از متد ()choice میتوان به صورت رندوم، یکی از عناصر یک آرایه خاص را انتخاب کرد. این متد یک آرایه را به عنوان ورودی میگیرد و به صورت رندوم یکی از عناصر آن را برمیگرداند. به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.choice([3, 5, 7, 9]) print(x) |
همچنین با متد choice میتوان یک آرایه با shape دلخواه حاوی عناصر آرایه ورودی ساخت. برای روشن شدن موضوع، به این مثال توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.choice([3, 5, 7, 9], size=(3, 5)) print(x) |
توزیع دادهها چیست؟
توزیع دادهها (data distribution)، لیستی از تمام مقادیر ممکن و تعداد تکرار هر یک از آنهاست. چنین لیستهای در علم آمار و داده، اهمیت فراوانی دارد.
تابع چگالی احتمال (Probability Density Function)
تابع چگالی احتمال، تابعی است که یک احتمال پیوسته مانند احتمال وقوع هر یک از عناصر یک آرایه را توضیح میدهد.
توزیع رندوم (Random Distribution)
توزیع رندوم، مجموعهای از اعداد همراه با احتمال وقوع هر یک از آن اعداد است. به عنوان مثال آرایه زیر و آرایه احتمال وقوع هر یک از عناصر آن را ببینید:
[۳, ۵, ۷, ۸]
[p = [0.1, 0.3, 0.6, 0.0
توجه: احتمال عددی از صفر تا یک است؛ احتمال صفر به این معنی است که آن عدد هرگز اتفاق نمیافتد و احتمال یک به معنی وقوع حتمی آن عدد است.
توجه: مجموع احتمالات اعداد مختلف باید یک شود.
حال فرض کنید بخواهیم یک آرایه با استفاده از اعداد آرایه بالا و با در نظر گرفتن احتمالات آنها بسازیم؛ این کار به شیوه زیر قابل انجام است:
1 2 3 4 5 |
from numpy import random x = random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=(100)) print(x) |
اگر کد بالا را هزار بار هم تکرار کنید، هیچ یک از عناصر آرایه حاصل، ۹ نخواهد شد؛ زیرا احتمال وقوع آن صفر است.
جایگشت رندوم (Random Permutation)
جایگشت یک آرایه، آرایهای است با همان عناصر و با ترتیبی متفاوت. به عنوان مثال، یک جایگشت برای آرایه [۳ ,۲ ,۱]، آرایه [۲ ,۱ ,۳] خواهد بود.
برای انجام جایگشت با استفاده از numpy، دو متد وجود دارند: shuffle و permutation.
متد shuffle، یک جایگشت از آرایه میسازد و همان آرایه اصلی را تغییر میدهد؛ اما متد permutation، آرایه اصلی را تغییر نمیدهد؛ بلکه یک آرایه با جایگشت جدید برمیگرداند. به مثالهای زیر توجه کنید:
1 2 3 4 5 6 7 8 |
from numpy import random import numpy as np arr = np.array([1, 2, 3, 4, 5]) random.shuffle(arr) print(arr) |
1 2 3 4 5 6 |
from numpy import random import numpy as np arr = np.array([1, 2, 3, 4, 5]) print(random.permutation(arr)) |
آشنایی با کتابخانه seaborn برای ترسیم توزیعهای احتمال
برای ترسیم توزیعهای رندوم میتوان از کتابخانهای به نام seaborn استفاده کرد؛ این کتابخانه بر روی کتابخانه matplotlib سوار میشود و با استفاده از آن کار میکند. با استفاده از دستور pip install seaborn در خط فرمان، میتوانید کتابخانه seaborn را نصب کنید.
تابع distplot در کتابخانه seaborn
distplot سرواژهی عبارت distribution plot به معنای نمودار توزیع است. تابع distplot، یک آرایه را به عنوان ورودی میگیرد و نمودار متناظر با توزیع نقاط موجود در آن آرایه را رسم میکند. به مثال زیر توجه کنید:
1 2 3 4 5 6 |
import matplotlib.pyplot as plt import seaborn as sns sns.distplot([, 1, 2, 3, 4, 5]) plt.show() |
اگر میخواهید هیستوگرام نمایش داده نشود و تنها یک خم ببینید، کافی است hist=False را به آرگومانهای ورودی تابع اضافه کنید.
توزیع احتمال نرمال (توزیع گاوسی – Normal Distribution)
توزیع احتمال نرمال یا گاوسی، یکی از مهمترین توزیعها در دنیای آمار و احتمال است. توزیع بسیاری از پدیدههای طبیعی مانند IQ افراد یا ضربان قلب، بسیار نزدیک به توزیع نرمال است. برای ساخت یک توزیع نرمال، میتوانید از متد ()random.normal استفاده کنید. به توزیع نرمال به خاطر شکلی ظاهریاش، توزیع زنگولهای نیز گفته میشود. متد یادشده، سه آرگومان ورودی دارد:
- loc: میانگین توزیع
- scale: انحراف معیار توزیع
- size: بعد و اندازه (shape) آرایه مورد نظر
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.normal(loc=1, scale=2, size=(2, 3)) print(x) |
تکه کد زیر مثالی برای مصورسازی یک توزیع نرمال است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.normal(size=1000), hist=False) plt.show() |
توزیع احتمال دوجمله ای (Binomial Distribution)
توزیع احتمال دوجملهای در دستهی توزیعهای احتمال گسسته جای میگیرد. در واقع، این توزیع یک پدیدهی دوحالتی مانند پرتاب سکه (شیر یا خط) را توضیح میدهد. برای ساخت یک آرایه با عناصری که توزیع دوجملهای دارند، میتوان از متد ()binomial استفاده کرد؛ این متد سه آرگومان زیر را میگیرد:
- n: تعداد انجام آزمایش
- p: احتمال وقوع پدیده مورد نظر در هر آزمایش
- size: بعد و تعداد (shape) آرایه مورد نیاز
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.binomial(n=10, p=0.5, size=10) print(x) |
تکه کد زیر مثالی برای مصورسازی یک توزیع دوجملهای است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.binomial(n=10, p=0.5, size=1000), hist=True, kde=False) plt.show() |
تفاوت توزیع های احتمال نرمال و دوجملهای
تفاوت اصلی آن است که توزیع نرمال، پیوسته ولی توزیع دوجملهای، گسسته است. البته اگر در یک توزیع دوجملهای، دادهها به اندازهی کافی زیاد باشند، با اتصال آنها میتوان به یک توزیع نرمال رسید که میانگین و انحراف معیار برای آن قابل تعریف است. در کد زیر یک توزیع نرمال و یک توزیع دوجملهای که شبیه هستند را رسم کردهایم:
1 2 3 4 5 6 7 8 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.normal(loc=50, scale=5, size=1000), hist=False, label='normal') sns.distplot(random.binomial(n=100, p=0.5, size=1000), hist=False, label='binomial') plt.show() |
توزیع احتمال پواسن (Poisson Distribution)
توزیع احتمال پواسن در دستهی توزیعهای احتمال گسسته قرار میگیرد. توزیع پواسن تعداد دفعاتی که یک رخداد خاص در یک بازه زمانی رخ میدهد را به ما نشان میدهد. توزیع پواسن دو پارامتر اصلی دارد:
- lam: تعداد دفعاتی که میدانیم آن رخداد اتفاق میافتد
- size: فرم یا shape آرایه مورد نیاز
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.poisson(lam=2, size=10) print(x) |
تکه کد زیر برای مصورسازی توزیع پواسن است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.poisson(lam=2, size=1000), kde=False) plt.show() |
تفاوت توزیع های احتمال نرمال و پواسن
توزیع نرمال یک توزیع پیوسته، اما توزیع پواسن گسسته است. مانند توزیع دوجملهای، اگر توزیع پواسن ما تعداد زیادی داده داشته باشد، به فرم توزیع نرمال در میآید. در کد زیر یک توزیع نرمال و یک توزیع پواسن که شبیه هستند را رسم کردهایم:
1 2 3 4 5 6 7 8 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.normal(loc=50, scale=7, size=1000), hist=False, label='normal') sns.distplot(random.poisson(lam=50, size=1000), hist=False, label='poisson') plt.show() |
تفاوت توزیع های احتمال پواسن و دوجملهای
تفاوت بین این دو توزیع بسیار نامحسوس است و برای درک آن باید کمی دقت کنید. توزیع دوجملهای، نحوه توزیع دادههای باینری از یک نمونه متناهی را توضیح میدهد. توزیع پواسن نحوه توزیع دادههای باینری از یک نمونه نامتناهی را توضیح میدهد. در واقع در توزیع دوجملهای، آزمایشهای ما ماهیتی گسسته دارند ولی در توزیع پواسن، ماهیتی پیوسته دارند.
برای nهای خیلی بزرگ (سمپلهای زیاد)، حاصل ضرب n*p تقریبا برابر با lam میشود. به کد زیر که مقایسه نمودارهای توزیع پواسن و دوجملهای است دقت کنید:
1 2 3 4 5 6 7 8 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.binomial(n=1000, p=0.01, size=1000), hist=False, label='binomial') sns.distplot(random.poisson(lam=10, size=1000), hist=False, label='poisson') plt.show() |
توزیع احتمال یکنواخت (Uniform Distribution)
این توزیع برای توضیح احتمال رویدادهایی به کار میرود که هر رخداد در آن شانس برابری دارد؛ به عبارت دیگر احتمال وقوع رخدادها در توزیع یکنواخت، برابر است. توزیع یکنواخت در ماژول رندوم نامپای، سه آرگومان ورودی دارد:
- a: حد پایین (پیشفرض ۰ است)
- b: حد بالا (پیشفرض ۱ است)
- size: فرم یا shape آرایه مورد نیاز
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.uniform(size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع یکنواخت است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.uniform(size=1000), hist=False) plt.show() |
توزیع احتمال لجستیک (Logistic Distribution)
توزیع احتمال لجستیک برای توضیح و مدلسازی رشد استفاده میشود. در یادگیری ماشین نیز به طور گستردهای در رگرسیون لجستیک و شبکههای عصبی از توزیع لجستیک استفاده میشود. توزیع لجستیک سه آرگومان ورودی دارد:
- loc: میانگین (جایی که پیک نمودار است – به صورت پیشفرض صفر است)
- scale: انحراف معیار توزیع (به صورت پیشفرض یک است)
- size: سایز یا shape آرایه مورد نیاز
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.logistic(loc=1, scale=2, size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع احتمال لجستیک است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.logistic(size=1000), hist=False) plt.show() |
تفاوت توزیع های احتمال لجستیک و نرمال
توزیعهای لجستیک و نرمال، شباهت زیادی به یکدیگر دارند؛ اما توزیع لجستیک، در نقاط دور از میانگین، سطح زیر نمودار بیشتری دارد. به عبارت دیگر، احتمال وقوع مقادیر دور از میانگین، در توزیع لجستیک، بیشتر از توزیع نرمال است. برای مقادیر بزرگ انحراف معیار، نمودارهای توزیع لجستیک و توزیع نرمال، شکل تقریبا یکسانی دارند. به کد زیر که مقایسهی نمودارهای توزیع لجستیک و توزیع نرمال است دقت کنید:
1 2 3 4 5 6 7 8 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.normal(scale=2, size=1000), hist=False, label='normal') sns.distplot(random.logistic(size=1000), hist=False, label='logistic') plt.show() |
توزیع احتمال چندجملهای (Multinomial Distribution)
توزیع احتمال چندجملهای حالت تعمیمیافتهی توزیع احتمال دوجملهای است؛ در توزیع دوجملهای، برآمدهای یک آزمایش تنها دو حالت داشتند؛ اما برآمدهای توزیع چندجملهای میتوانند چندین حالت داشته باشند؛ به عنوان مثال پرتاب تاس یا گروه خونی در یک جمعیت را میتوان با توزیع چندجملهای مدل کرد. توزیع چندجملهای سه آرگومان ورودی دارد:
- n: تعداد برآمدهای ممکن
- pvals: لیست احتمال هر یک از برآمدها
- size: سایز یا shape آرایه مورد نیاز
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.multinomial(n=6, pvals=[1/6, 1/6, 1/6, 1/6, 1/6, 1/6]) print(x) |
توجه: با توجه به این که توزیع چندجملهای حالت تعمیمیافتهی توزیع دوجملهای است، شکل نمودار توزیع چندجملهای و نحوه شباهت آن با توزیع نرمال، شبیه به توزیع دوجملهای است.
توزیع احتمال نمایی (Exponential Distribution)
توزیع احتمال نمایی برای توصیف زمان مورد نیاز برای وقوع رخداد بعدی به کار میرود. توزیع نمایی دو آرگومان ورودی دارد:
- scale: عکس نرخ (به صورت پیشفرض یک است)
- size: سایز یا shape آرایه مورد نیاز
به مثال زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.exponential(scale=2, size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع نمایی است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.exponential(size=1000), hist=False) plt.show() |
رابطه توزیع های احتمال نمایی و پواسن
توزیع احتمال پواسن تعداد وقوع یک رخداد در یک بازه زمانی را به ما میگوید در حالی که توزیع نمایی زمان بین هر کدام از این رخدادها را به ما میدهد.
توزیع احتمال کی دو (Chi Square Distribution)
توزیع احتمال کی دو به عنوان پایهای برای اثبات فرضیه استفاده میشود و کاربردهای وسیعی در آمار استنباطی دارد. توزیع کی دو، دو آرگومان ورودی دارد:
- df: درجه آزادی
- size: سایز یا shape آرایه مورد نیاز
به کد زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.chisquare(df=2, size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع کی دو است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.chisquare(df=1, size=1000), hist=False) plt.show() |
توزیع احتمال رایلی (Rayleigh Distribution)
توزیع احتمال رایلی در پردازش سیگنال کاربرد دارد؛ دور آرگومان ورودی این توزیع عبارتند از:
- scale: انحراف معیار (به صورت پیش فرض یک است)
- size: سایز یا shape آرایه مورد نیاز
به کد زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.rayleigh(scale=2, size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع رایلی است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.rayleigh(size=1000), hist=False) plt.show() |
شباهت توزیع های احتمال رایلی و کی دو
توزیع رایلی با انحراف معیار یک و توزیع کی دو با درجه آزادی دو، توزیعهای یکسانی را ارائه میدهند.
توزیع احتمال پارتو (Pareto Distribution)
این توزیع از قانون پارتو پیروی میکند: ۲۰ درصد از کارها، ۸۰ درصد از نتایج را به ارمغان میآورند. توزیع پارتو دو آرگومان ورودی دارد:
- a: پارامتر shape
- size: سایز یا shape آرایه مورد نیاز
به کد زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.pareto(a=2, size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع پارتو است:
1 2 3 4 5 6 7 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns sns.distplot(random.pareto(a=2, size=1000), kde=False) plt.show() |
توزیع زیف (Zipf Distribution)
این توزیع از قانون زیف پیروی میکند: در یک مجموعه از دادهها، تعداد nامین داده پرتکرار، ۱/n پرتکرارترین داده است؛ به عنوان مثال، پنجمین لغت پراستفاده در انگلیسی، یک پنجم پراستفادهترین لغت، استفاده شده است. توزیع زیف دو آرگومان ورودی دارد:
- a: پارامتر توزیع
- size: سایز یا shape آرایه مورد نیاز
به کد زیر توجه کنید:
1 2 3 4 5 |
from numpy import random x = random.zipf(a=2, size=(2, 3)) print(x) |
تکه کد زیر برای مصورسازی توزیع احتمال زیف است:
1 2 3 4 5 6 7 8 |
from numpy import random import matplotlib.pyplot as plt import seaborn as sns x = random.zipf(a=2, size=1000) sns.distplot(x[x<10], kde=False) plt.show() |
سلام بسیار جامع و مفید بود ممنون از شما
فقط یک خواهش داشتم امکان داره از روی این مطلب با ذکر منبع در کلاسم تدریس کنم؟
اگر اجازه بدید ممنون میشم
ممنون از لطف شما
استفاده از مطالب با ذکر مطلب مشکلی نداره