دستور rand در متلب (تولید اعداد تصادفی به زبان ساده)
مقایسه کدهای Matlab و Numpy برای بازتولید اعداد و آرایه های تصادفی
همانطور که می دانید نامپای (Numpy)، کتابخانه ای برای زبان برنامه نویسی پایتون (Python) است که از آن به همراه مجموعه ای از توابع ریاضی سطح بالا برای محاسبات ماتریس در پایتون و کار روی آرایه های برداری، ماتریس و تانسور استفاده می شود. متلب (Matlab) نیز یک زبان برنامه نویسی و محیط محاسبات عددی است که در آن می توان محاسبات ماتریسی، ترسیم توابع و داده ها، پیاده سازی الگوریتم ها و ایجاد رابط ها را پیاده کرد و رابطی برای برنامه های نوشته شده به زبانهای دیگر ایجاد کرد.
ویژگی مشترک Numpy و Matlab این است که از هر دوی آنها در طیف وسیعی از محاسبات ماتریسی و عددی استفاده می شود. با این وجود تفاوتهایی هم با یکدیگر دارند. ما در این پست نحوه تولید اعداد و آرایه های تصادفی در Matlab و Numpy را بررسی می کنیم و این دو را از لحاظ بازتولید اعداد تصادفی و آرایه های یکسان با هم مقایسه می نماییم.
حتما بخوانید: دانلود رایگان ۱۳ فیلم کاربردی آموزش شبکه عصبی متلب
اعداد و آرایه های تصادفی
هم نامپای و هم متلب می توانند با استفاده از یک دستور خاص، اعداد و آرایه های تصادفی تولید کنند. در اینجا دو مفهوم مهم و کلیدی وجود دارد:
- توزیع اعداد تصادفی (Random number distribution)
- دانه تصادفی (Random seed)
در مورد توزیع اعداد تصادفی، معمولا از توزیع یکنواخت و توزیع نرمال استاندارد (گاوسی) استفاده می کنیم. در نامپای می توانیم از numpy.random.rand برای تولید اعداد تصادفی با توزیع یکنواخت استفاده کنیم. در متلب نیز با استفاده از دستور rand می توانیم اعداد تصادفی با توزیع یکنواخت تولید کنیم. به مثالهای ساده زیر توجه کنید:
نامپای در پایتون:
import numpy as np
sample = np.random.rand(2)
print(sample)
خروجی:
[0.70573498 0.8595017 ]
متلب:
sample = rand(1, 2)
خروجی:
ans =
0.5390 0.7686
مثالهای بالا نمونه هایی از نحوه تولید اعداد تصادفی با توزیع یکنواخت هستند. علاوه بر این می توانیم اعداد تصادفی تولید کنیم که از توزیع نرمال استاندارد پیروی می کنند. برای اینکار از دستورهای زیر استفاده می کنیم:
نامپای در پایتون: np.random.randn
متلب: randn
برای تولید اعداد تصادفی با یک توزیع خاص می توانیم از یک فرمان یا تابع خاص استفاده کنیم، اما در این صورت هر بار که کدهایمان را بازتولید می کنیم، عدد تصادفی تولید شده متفاوت خواهد بود. اینجاست که دانه تصادفی به عنوان یک اصل کلیدی دیگر مطرح می شود که به شما اجازه می دهد هر بار یک عدد تصادفی ثابت تولید کنید.
از آموزشهای جدید متلب: حلقه if در متلب (آموزش گام به گام و نکات)
به عنوان مثال کد پایتون زیر را در نظر بگیرید:
import numpy as np
np.random.seed(10)sample = np.random.rand(2)
print(sample)
که این اعداد تصادفی را تولید می کند:
[0.77132064 0.02075195]
در متلب نیز:
rng(10);
sample = rand(1, 2)
این خروجی را خواهیم داشت:
sample =0.7713 0.0208
مقایسه توابع Rand در متلب و نامپای
توابع Rand در متلب و نامپای برای محاسبات آرایه های مختلفی استفاده می شوند:
- آرایه یک بعدی (1-D array) به بردار اشاره دارد.
- آرایه دو بعدی (2-D array) به ماتریس اشاره دارد.
- آرایه سه بعدی (3-D array) به تانسور مرتبه سوم اشاره دارد.
- ……
- آرایه n بعدی (n-D array) به تانسور مرتبه n اشاره دارد.
در ادامه قصد داریم اعداد تصادفی با توزیع یکنواخت را به ترتیب در نامپای و متلب تولید کنیم. علاوه بر این سعی میکنیم اعداد تصادفی یکسانی در نامپای و متلب تولید کنیم.
حتما بخوانید: کجا و به چه دلیل باید از نرم افزار متلب استفاده کنیم یا نکنیم؟
تولید آرایه یک بعدی
برای اینکه اعداد تصادفی یکسانی با توزیع یکنواخت در نامپای و متلب به دست بیاوریم، اندازه برداری را 4 و دانه تصادفی را 10 قرار می دهیم. بیایید امتحان کنیم:
نامپای:
import numpy as np
np.random.seed(10)sample = np.random.rand(4)
print(sample)
با اجرای این کد خواهیم داشت:
[0.77132064 0.02075195 0.63364823 0.74880388]
متلب:
rng(10);
sample = rand(1, 4)
با اجرای این کد خواهیم داشت:
sample =
0.7713 0.0208 0.6336 0.7488
کاملا واضح است که هر دو بردار تصادفی تولید شده مشابه هم هستند.
تولید آرایه دو بعدی
برای تولید آرایه دو بعدی، ابتدا ماتریس را 2 در 3 و دانه تصادفی را 10 قرار می دهیم.
نامپای:
import numpy as np
np.random.seed(10)sample = np.random.rand(2, 3)
print(sample)
با اجرای این کد خواهیم داشت:
[[0.77132064 0.02075195 0.63364823] [0.74880388 0.49850701 0.22479665]]
متلب:
rng(10);
sample = rand(2, 3)
با اجرای آن خواهیم داشت:
sample =
0.7713 0.6336 0.4985
0.0208 0.7488 0.2248
همانطور که مشاهده می کنید، ماتریس های تصادفی تولید شده با توزیع یکنواخت، یکی هستند.
آموزش جدید متلبی: روش گوس سایدل در متلب از صفر تا صد
تولید آرایه سه بعدی
ابتدا اندازه ماتریس را 2 در 3 و دانه تصادفی را 10 قرار می دهیم.
نامپای:
import numpy as np
np.random.seed(10)sample = np.random.rand(2, 3, 2)
print(‘sample[:, :, 0] = ‘)
print()
print(sample[:, :, 0])
print()
print(‘sample[:, :, 1] = ‘)
print()
print(sample[:, :, 1])
با اجرای آن خواهیم داشت:
sample[:, :, 0] =
[[0.77132064 0.63364823 0.49850701] [0.19806286 0.16911084 0.68535982]]
sample[:, :, 1] =
[[0.02075195 0.74880388 0.22479665] [0.76053071 0.08833981 0.95339335]]
متلب:
rng(10);
sample = rand(2, 3, 2)
با اجرای آن خواهیم داشت:
sample(:,:,1) =
0.7713 0.6336 0.4985
0.0208 0.7488 0.2248
sample(:,:,2) =
0.1981 0.1691 0.6854
0.7605 0.0883 0.9534
مشاهده می کنید که تانسورهای تصادفی تولید شده با توزیع یکنواخت، یکی هستند.
دانلود کنید: ۷ درس کاربردی آموزش برنامه نویسی در متلب
تولید اعداد تصادفی با توزیع نرمال در نامپای و متلب
همانطور که دیدید، نامپای و متلب می توانند در صورت استفاده از یک دانه تصادفی، اعداد تصادفی یکسانی با توزیع یکنواخت تولید کنند. متاسفانه از آنجایی که نامپای و متلب از تبدیل های متفاوتی برای تولید نمونه ها از توزیع نرمال استاندارد استفاده می کنند، بنابراین مجبوریم از همان تبدیل در نامپای و متلب استفاده کنیم. در عمل، بازتولید خروجی ()randn متلب همانند نامپای هنوز هم امکان پذیر است.
نامپای:
import numpy as np
from scipy.stats import norm
np.random.seed(10)sample = norm.ppf(np.random.rand(2, 3))
print(sample)
به این ترتیب خواهیم داشت:
[[ 0.74320312 -2.03846052 0.34153145] [ 0.67073049 -0.00374237 -0.75609325]]
متلب:
rng(10);
sample = norminv(rand(2, 3), 0, 1)
با این کار خواهیم داشت:
sample =
0.7432 0.3415 -0.0037
-2.0385 0.6707 -0.7561
همانطور که می بینید، ماتریس های تصادفی تولید شده با توزیع نرمال، یکی هستند.