در این مطلب، به طور بینهایت کامل تولید عدد تصادفی (random) از توزیعها و حالات مختلف در پایتون (Python) رو آموزش خواهیم داد! اگر احیاناً توزیعی دیگهای پیدا کردید که میشد ازش توی پایتون عدد تصادفی تولید کرد! و یا حتی سوالی داشتید، در بخش نظرات این مطلب با ما در میون بذارید تا همواره مطلب رو بروز و ایده آل نگه داریم (ان شاء الله)…
خیلی از جاها میگیم که مثلاً یک عدد تصادفی میخوایم تولید کنیم از و مثلاً Exp(β=2) و مثلاً نه از توزیع Exp(λ=2) !! شاید در نگاه اول بگید که این یک اسم گذاری ساده است و بین این دو توزیع هیچ فرقی وجود نداره! اما واقعیت اینه که نه ما، بلکه خیلیهای دیگه هم نمایی رو با دو فرم نمایش میدهند! و سوال اینجاست که ما داریم از کدومِ اینا عدد تصادفی تولید میکنیم!
یا مثلاً یه جایی میگیم از توزیع لاپلاس عدد تصادفی تولید میکنیم! ولی سوال اینجاست که اصلاً توزیع لاپلاس چیه که بخوایم ازش عدد تصادفی تولید کنیم؟!
برای همین، لطفاً جزوه زیر رو دانلود کنید تا به یک ادبیات مشترک در تمام این متن برسیم! جزوهای که شدیداً برای آن و برای ان مطلب که دارید میخونید زحمت کشیده شده! پس لطفا حق بنده به عنوان مولف آن را رعایت کنید! واقعاً خیلی خیلی زیاد وقت گذاشتم!
در جزوه زیر، تمام توزیعهای معروف و حتی نیمه معروف (مثل لاپلاس) آورده شده، شکل آنها رسم شده، تابع چگالی، امید ریاضی و واریانس آنها گفته شده و ….!
دانلود جزوه (حجم: 700 کیلوبایت) (تعداد صفحه: 9) (نوع جزوه: تایپشده)
نکته 1: برای تولید عدد تصادفی در پایتون (python) هم میشه از خود پکیج های خودِ خودش استفاده کرد! و هم از پکیجهای دیگه مثل NumPy! از اونجایی که امکانات پکیج NumPy خیلی بیشتره، نه ما، خیلیها دیگه هم برای تولید عدد تصادفی از پکیج NumPy استفاده میکنن!
نکته 2: برای استفاده از پکیج NumPy باید ابتدا اون رو نصب کنید، برای آموزش نصب مراجعه کنید به مطلب زیر!:
آموزش نصب پکیجهای مختلف در پایتون (python)
نکته 3: پس از اینکه NumPy رو نصب کردید، حالا باید به پایتون (Python) بگید که لطفاً برام NumPy رو بذار بیاد توووو! که ازش استفاده کنم!!! حالا اینو چجوری باید بگیم؟!
باید بگیم:
import numpy as np
یعنی پکیج numpy رو as (یعنی به عنوان) np وارد کن (import یعنی وارد کردن)! حالا این np یعنی چی؟ و چرا np؟ اسم دیگه نمیشد؟!
ببینید، برای اینکه در ادامه حوصله نداریم به صورت کامل بنویسیم numpy و میخوایم خلاصه کنیم! به پایتون (Python) میگیم که اگر همون numpy رو خلاصه میکنم به عنوان np که از این به بعد دیگه سه ساعت ننویسیم numpy!
حالا سوال پیش میاد که بجز np هم میشه چیز دیگه نوشت! بله میشه! هر چی دوست دارین! اصلاً میتونین اسم خودتون رو بذارین!!
فرم کلّی:
np.random.binomial(n,p)
فرض کنید میخواهیم از یک توزیع دوجملهای به صورت Bin(n=10,p=0.5) یک عدد تصادفی تولید کنیم! در این صورت داریم!:
import numpy as np a=np.random.binomial(10,0.5) print(a)
که مثلاً خروجی برابر خواهد بود با!:
5
فرم کلّی:
np.random.binomial(1,p)
فرض کنید میخواهیم از توزیع برنولی به صورت Ber(p=0.5) یک عدد تصادفی تولید کنیم!
اولاً میدانیم که اگر در توزیع دوجملهای (Binomial) پارامتر n را برابر 1 قرار دهیم، به توزیع برنولی میرسیم! پس برای تولید عدد تصادفی از توزیع برنولی با پارامتر p=0.5 داریم!:
import numpy as np a=np.random.binomial(1,0.5) print(a)
که این بار فرض کنید خروجی زیر را میدهد!:
0
فرم کلّی:
np.random.poisson(lambda)
فرض کنید میخواهیم از توزیع پواسون به صورت P(λ=10) یک عدد تصادفی تولید کنیم! در این صورت مینویسیم:
import numpy as np a=np.random.poisson(10) print(a)
که مثلاً نتیجه آن میشود!:
12
فرم کلّی:
np.random.geometric(p)
اگر بخواهیم از توزیع هندسی به صورت Ge(p=0.5) یک عدد تصادفی تولید کنیم، باید کدی به صورت زیر بنویسیم!:
import numpy as np a=np.random.geometric(0.5) print(a)
که مثلاً خروجی آن عبارت است از:
2
فرم کلّی:
np.random.negative_binomial(r,p)
اگر بنا باشد از یک توزیع دوجمله ای منفی نوع شکست به فرم NB_q(r=4,p=0.5) یک عدد تصادفی تولید کنیم! باید بنویسیم:
import numpy as np y=np.random.negative_binomial(4,0.5) print(y)
که مثلاً خروجی زیر را میدهد!:
2
فرم کلّی: ندارد! باید توضحات رو کامل بخونید!
فرض کنید میخواهیم از یک توزیع دو جمله ای منفی نوع آزمایش که به فرم NB(r=4,p=0.5) است، یک عدد تصادفی تولید کنیم!
اولاً میدانیم که اگر تعداد موفقیتها را با r، متغیر تصادفی تعداد آزمایشها تا رسیدن به r اُمین موفقیت را با X و متغیر تصادفی تعداد شکستها تا رسیدن به r اُمین موفقیت را با Y نمایش دهیم! داریم:
Y+r=X
تذکر: چون میدونم یه عده دوستان بهم گیر خواهند داد!!! بگم که از لحاظ علم احتمال، جملهی بالا نادقیق است! به عنوان نمونه حتماً باید ذکر شود که آزمایشهای مستقل برنولی! ولی خب چون اون وقت فهم جمله فوق سختتر میشد، دیگه اینجوری که میبینید نوشتم! ولی تاکید میکنم که جمله فوق، در اصل و از منظر علم احتمال، نادقیق است!
که درواقع Yهمان متغیر تصادفی دوجملهای منفی نوع شکست است! و X همان متغیر تصادفی دو جمله ای منفی نوع آزمایش! پس برای تولید یک عدد تصادفی از متغیر تصادفی دوجمله ای منفی نوع آزمایش به فرم NB(r=4,p=0.5) مینویسیم:
import numpy as np r=4;p=0.5 y=np.random.negative_binomial(r,p) x=y+r print(x)
دلیل اینکه چرا پارامترها رو یک راست استفاده نکردم و جداگانه تعریف کردم و خلاصه به صورت فوق نوشتم، خوانایی و کمک به فهم بیشتر مطلب است.
و خروجی مثلاً برابر خواهد بود با!:
10
نکته: توزیع دوجملهای منفی به توزیع پاسکال نیز معروف است!
فرم کلّی:
np.random.hypergeometric(ngood,nbad,nsample)
اگر مدنظر داشته باشیم که از توزیع فوق هندسی به فرم HG(N,m,n) یک عدد تصادفی تولید کنیم! باید چند نکته را یادآوری کنیم!
نکته 1: واضح است در فرم مذکور: تعداد خوبها (یا همان خاصها) که پکیج numpy آن را با ngood نمایش میدهد! همان m خودمان است!
نکته 2: از آنجایی که کل محموله شامل N قطعه است! پس تعداد بدها (یا همان غیرخاصها) که پکیج numpy آن را با nbad نمایش میدهد! همان N-m خودمان است!
و این را هم بدانید که فرم وارد کردن پارامترها در پکیج numpy برای توزیع فوق هندسی، با فرمی که در احتمال و آمار برای نمایش توزیع فوق هندسی مرسوم است، کمی تفاوت دارد! و numpy بجای اینکه توزیع فوق هندسی را به فرم
HG(N, m, n)
نمایش دهد! آن را به فرم
HG(ngood, nbad, nsample)
نمایش میدهد! که گفتم منظورش از ngood و nbad چیه! nsample هم که یعنی اندازه نمونه! که همون n خودمونه!
واقعا چرا؟!!! چرا به همون فرمی که معمولاً توی احتمال و آمار مرسومه اینا رو درست نمیکنن تا ما برای توضیحش اینقدر فلاکت نکشیم!!!
خلاصه! تصور کنید میخوایم از توزیع HG(N=100,m=80,n=10) یک عدد تصادفی تولید کنیم! پس میگیم!:
import numpy as np N=100;m=80;n=10 a=np.random.hypergeometric(m,N-m,n) print(a)
بازهم واضحه که دلیل اینکه مستقبماً عددها رو توی تابع نذاشتم و بجاش اومدم اون همه متغیر تعریف کردم، اینه که فهمش ساده تر بشه!
و نهایتاً خروجی مثلاً میشه:
6
فرم کلّی:
np.random.randint(a,b)
فرض کنید به عنوان نمونه میخوایم یک عدد تصادفی بین 1 تا 100 تولید کنیم! در این صورت مینویسیم!
import numpy as np a=np.random.randint(1,101) print(a)
فکر کنم میدونید چرا بجای 100 نوشتیم 101 ! بله درسته! همانطور که در خیلی از موارد دیگه (مثل تابع range و غیره) در دیدید، عدد آخر حساب نمیشه! پس اینجا که عدد صحیحه! یکی کمترش حساب میشه! یعنی اینجا عملاً از 1 تا 100، به هر حال یک عدد انتخاب میکنه به طور تصادفی و نشون میده!
مثلاً فرض کنید خروجی میشه!:
24
فرم کلّی:
np.random.uniform(a,b)
تصور کنید میخواید یک عدد تصادفی تولید کنید! و عدد تصادفی تولید شده رو در متغیری به اسم b ذخیره کنید!
مثلاً فرض کنید میخواین یک عدد تصادفی پیوسته اعشاری در بازه 7 تا 14 تولید کنید که خود 7 رو حساب کنه ولی 14 رو حساب نکنه! یعنی تولید عدد تصادفی در بازه زیر:
[7,14)
در این صورت مینویسیم:
import numpy as np a=np.random.uniform(7,14) print(a)
که مثلاً ممکنه عدد تصادفی که خروجی میده، عبارت زیر باشه!:
12.934798328911073
فرم کلّی:
np.random.triangular(a,c,b)
برای تولید یک عدد تصادفی مانند N از توزیع مثلثی trian(a=-4,c=-2,b=6) به طوریکه a<=N<=b و با مُد c داریم:
import numpy as np a=np.random.triangular(-4,-2,6) print(a)
در قطعه کد بالا، قرار است یک عدد تصادفی تولید کنیم از توزیع مثلثی! بین بازه منفی 4 تا مثبت 6! بطوریکه مُد توزیع نیز منفی 2 باشد!
که مثلاً ممکن است خروجی آن به صورت زیر باشد!:
-2.406330554228589
فرم کلّی:
np.random.normal(miu,sigma)
فرض میکنیم که میخوایم از توزیع نرمال به فرم N(μ=1000,σ=2) یک عدد تصادفی تولید کنیم، پس داریم!:
import numpy as np a=np.random.normal(1000,2) print(a)
و مثلاً خروجیش میشه: 997.6353688995247
فرم کلّی:
np.random.exponential(beta)
فرض کنید قرار است از توزیع نمایی Exp(β=2) یک عدد تصادفی تولید کنیم! در این صورت مینویسیم:
import numpy as np a=np.random.exponential(2) print(a)
که صرفاً به عنوان یک مثال خروجیش میشه!:
2.1170123973285313
توجه کنید که میانگین توزیع رو داریم میدیم به این تابع تا برامون عدد تصادفی تولید کنه! (که البته در مورد این جور مسائل، اول همین مطلب، خیلی مفصل صحبت کردیم! اگر ندیدید، حتماً مراجعه کنید به بخش جزوه پیشنیاز در ابتدای همین مطلب!)
فرم کلّی:
np.random.gamma(alpha,beta)
فرض کنید قرار است از توزیع گاما به صورت Gamma(α=5,β=2) یک عدد تصادفی تولید کنیم! در این صورت مینویسیم:
import numpy as np a=np.random.gamma(5,2) print(a)
که به عنوان مثال و نمونه، خروجیش میشه!:
3.7843667202014406
اگر میخواید ببینید که اصلاً این توزیع گاما که داریم ازش عدد تصادفی تولید میکنیم، تابع چگالیش چی بوده که اصلاً ازش دارم عدد تصادفی تولید میکینم، به بخش جزوه پیشنیاز در ابتدای همین مطلب مراجعه کنید!
فرم کلّی:
np.random.beta(a,b)
این بار فرض کنید میخوایم یک عدد تصادفی از توزیع بتا به فرم Beta(a=0.5,b=0.5) تولید کنیم! باید کد زیر رو بنویسیم!:
import numpy as np a=np.random.beta(0.5,0.5) print(a)
که مثلاً خروجیش میشه:
0.9833010436841305 !
فرم کلّی: اولاً باید حتما توضیحات رو بخونید چون پکیج NumPy اینجا خوب نیست! و از پکیج random خود پایتون (python) استفاده میکنیم! که فرم کلی اون میشه:
rd.weibullvariate(alpha,beta)
اگر قرار باشد، یک عدد تصادفی از توزیع وایبول Weibull(α=2,β=1) تولید کنیم! متاسفانه یکم به مشکل میخوریم!! البته بازهم ما براش راه حل داریم! ولی خب یه ذره مشکل رووو شاخشه!
نکتهی اول اینکه پکیج NumPy متاسفانه تولید عددتصادفی برای توزیع وایبول رو فقط به ازای α=1 انجام میده! (واقعا چرا؟؟!!!) که خب بدردمون نمیخوره! ما حالت کلی رو دوست داریم!
خود پایتون هم تووی خودش یک پکیج داره (که اصلاً نیاز نداره نصب کنید حتی)! به اسم random، که از اون میتونید استفاده کنید! قبل از آموزش کدنویسی تولید عدد تصادفی با اون! بذارید به این سوالی احتمالی شما که: “خب چه کاریه! همونو آموزش میدادید!” جواب بدم!
واقعیت اینه که پکیج NumPy برای تولید عدد تصادفی خیلی خوب و قوی عمل میکنه! و برای همین ما (و خیلی های دیگه) این پکیج رو به پکیج random خود پایتون ترجیح میدن! و بیاید این کمکاری پکیج NumPy در مورد توزیع گاما رو ببخشیم!
اما میشه بجاش اینجوری عمل کرد!:
import random as rd a=rd.weibullvariate(2,5) print(a)
هرچند مشخصه ولی بازهم توضیح میدم:
توی خط اول، پکیج random رو فراخوانی میکنیم! و چون حوصله نداریم هِی به طور کامل بنویسیم random، میگیم as (یعنی به عنوان) rd این بنده خدا رو import کن! تا از این به بعد با rd صداش بزنیم! نه با random که اسم طولانیتری است و حوصله نداریم!!!
در خط دوم هم عددتصادفی رو میریزیم توی متغیر a و در خط سوم هم چاپش میکنیم!
که مثلاً خروج میشه!:
1.7950542759870798
شاید بازهم بپرسید خب اصلاً این توزیع وایبول که داره ازش عدد تولید میکنه، چجوری و چه شکلیه؟! بازهم میگم باید به جزوه پیشنیاز که در ابتدای همین مطلب برای دانلود گذاشتیم مراجعه کنید!
فرم کلّی:
np.random.chisquare(df)
اگر بخوایم از توزیع مربع کای χ2(ν=5) یک عددتصادفی تولید کنیم، داریم!:
import numpy as np a=np.random.chisquare(5) print(a)
که مثلاً خروجی زیر رو میده!:
4.717493848179437
فرم کلّی:
np.random.standard_t(df)
برای تولید عددتصادفی از توزیع t(ν=3) داریم!:
import numpy as np a=np.random.standard_t(3) print(a)
که مثلاً خروجی زیر رو میده!:
-1.8219390742711274
فرم کلّی:
np.random.f(df1,df2)
مثلاً برای تولید یک عددتصادفی از توزیع فیشر F(5,7) داریم!:
import numpy as np a=np.random.f(5,7) print(a)
که به عنوان نمونه، خروجی زیر را میدهد!:
2.1399994342643542
فرم کلّی:
np.random.laplace(miu,lambda)
برای تولید یک عدد تصادفی از توزیع لاپلاس Laplace(μ=-4,λ=4) داریم!:
import numpy as np a=np.random.laplace(-4,4) print(a)
که مثلاً خروجی زیر را خواهد داد!:
-2.7088183363078913
کلاً برای ایجاد چندتا (مثلاً 50 تا عددتصادفی) باید به صورت زیر عمل کنیم! من در زیر توزیع یکنواخت گسسته رو مثال میزنم! ولی در مورد بقیه هم صادقه!
import numpy as np x= np.random.randint(1,101,size=50)
این میاد از 1 تا 100، به تعداد 50تا عدد ایجاد میکنه! خروجی این 50تا عدد تصادفی رو هم ریختیم توی متغیری به اسم x !
پس کلاً یادمون باشه با اووون مولفه size توی این توابع (چه اینی که اینجا گفتیم و چه بقیه!) میتونید چندتا عددتصادفی ایجاد کنید!
تعداد دیدگاه | 6 |
تعداد بازدید | 11.4K |
تاریخ انتشار | 29/03/2019 |
تاریخ بروزرسانی | 29/03/2019 |
نویسنده | گروه آموزشی کولاک |