فراگیری فرمول‌های ریاضی با کد کامپیوتری

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

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

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

جمع و ضرب

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

x = [1, 2, 3, 4, 5]
result = 0
for i in range(5):
    result += x[i]

Output of print(result) -> 15

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

خیلی به ندرت خواهید دید اما کاربرد این نماد هم مهم است:

معمولا عملگر ضرب (Pi بزرگ) نامیده می‌شود، این نماد به همان شیوه عملگر سیگما عمل می‌کند، اما به جای اضافه کردن هر نتیجه آن‌ها در هم ضرب می‌شوند.

x = [1, 2, 3, 4, 5]
result = 0
for i in range(5):
    result *= x[i]

Output of print(result) -> 120

فاکتوریل

نماد فاکتوریل یک علامت تعجب است «!» برای بسیاری، این یکی ممکن است کمی روشن‌تر باشد، اما هنوز ارزش نوشتن کد برای درک نحوه عملکردش را دارد. به عنوان مثال !۵ به صورت زیر کد می‌شود:

result = 0 
for i in range(5):
    result *= i

Output of print(result) -> 120

براکت‌های شرطی

براکت های شرطی برای انحراف جریان یک معادله براساس مجموعه‌ای از شرایط به کار می‌روند. برای کدنویسی، به سادگی عبارت "if" رایج است. شرط بالا می‌تواند به صورت زیر نشان کد شود:

i = 3
y = [-2, 3, 4, 1]
result = 0
if i in y:
    result = sum(y)
elif i > 0:
    result = 1
else:
    result = 0

print(result) -> 6

همانطور که در بالا مشاهده شد، نشان گذاری درست هر ردیف از براکت نشان می‌دهد که هر مسیر باید چه چیزی را اجرا کند. من نماد "حاوی" را به هر شرط اضافه کردم تا اطلاعات بیشتری به آن اضافه کنم. همانطور که در بالا مشاهده شد، ما بررسی کردیم که آیا مقدار i در لیست y است یا نه. با توجه به اینکه این طور بود، مجموع آرایه را برگرداندیم. اگر مقدار i در آرایه نبود ما براساس مقدار ۰ یا ۱ باز گرداندیم.

ضرب نقطه‌ای و دکارتی ماتریس

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

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

توجه داشته باشید که شرط اول این است که هر دو ماتریس باید شکل یکسانی داشته باشد (یعنی تعداد سطر و ستون برابر) کد این نوع ضرب به صورت زیر است:

y = [[2,1],[4,3]]
z = [[1,2],[3,4]]
x = [[0,0],[0,0]]

for i in range(len(y)):
    for j in range(len(y[0])):
        x[i][j] = y[i][j] * z[i][j]

print(x) -> [[2, 2], [12, 12]]

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

فرض کنید دو ماتریس داریم که تعداد ستون‌های ماتریس اول باید با تعداد سطر‌های ماتریس دوم برابر باشد. نتیجه این ضرب ماتریسی با تعداد سطر برابر با تعداد سطر ماتریس اول و تعداد ستون برابر با تعداد ستون ماتریس دوم خواهد بود. این ممکن است گیج‌کننده به نظر برسد و بهترین پیشنهاد من این است که نگاهی به تصاویر google برای برخی از تجسم‌های بزرگ از این الزامات بیندازید.

کد این معادله به صورت زیر است:

y = [[1,2],[3,4]]
z = [[2], [1]]
# x has shape [2, 1]
x = [[0], [0]]

for i in range(len(y))
    for j in range(len(z):
        x[i][j] = np.dot(y[i], z[:, j])

print(x) -> [[4],
             [10]]



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


این متن ترجمه‌ای است از مقاله منتشر شده در وبلاگ towardsdatascience که با کمک موتور ترجمه مقالات علمی ترجمیار ترجمه شده و پس از ویرایش محدود انسانی منتشر شده است