12 عملیات ماتریسی که برای شروع علوم داده و یادگیری عمیق باید بدانید

 

 

مقدمه

 

اگر برای فراگیری علم یادگیری عمیق (deep learning) اقدام کرده‌اید، اولین چیزی که با آن مواجه خواهید شد، مفاهیم جبر خطی است که درک بهتری از نحوه عملکرد الگوریتمهای یادگیری عمیق را به شما میدهد و در تصمیم‌گیری‌های آتی بسیار مفید است. در یادگیری عمیق، یک شبکه عصبی (neural network) تغذیه-مستقیم (feed forward)، ساده‌ترین و مفیدترین شبکه است. به طور دقیقتر، شبکه عصبی تغذیه-مستقیم، تنها یک تابع ترکیبی است که برخی ماتریسها و بردارها را در هم ضرب میکند. شکل زیر ساختار چنین شبکه‌ای را نشان میدهد:

 

شکل 1- شبکه عصبی تغذیه-مستقیم

 

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

 

         – اسکالر

         – بردار

         – ماتریس

         – تنسور (tensor)

 

شکل2- ساختارهای داده مورد استفاده در یادگیری عمیق

 

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

 

 

فهرست مطالب

 

عناوین مورد بحث در این مقاله عبارت‌اند از:

 

           – ماتریس چیست؟

           – نحوه جمع و تفریق ماتریسهای مختلف

           – نحوه یافتن شکل و اندازه یک ماتریس مشخص

           – نحوه تبدیل یک ماتریس فشرده (dense) به یک ماتریس تنک (sparse)

           – نحوه یافتن ترانهاده (transpose) یک ماتریس

           – نحوه یافتن میانگین، واریانس و انحراف معیار یک ماتریس

           – نحوه یافتن اثر (trace) یک ماتریس

           – نحوه استخراج مقدار حداقل و حداکثر المانهای یک ماتریس

           – نحوه یافتن دترمینان (determinant) یک ماتریس

           – نحوه ضرب ماتریسها در هم

           – نحوه اعمال یک عمل خاص به هر المان یک ماتریس

           – نحوه یافتن معکوس یک ماتریس

           – نحوه تغییر شکل داده یک ماتریس به شکلهای مختلف

 

 

ماتریس چیست؟

 

ماتریسها، آرایه‌های مستطیلی-شکل شامل اعداد هستند که میتوان آنها را تنسور مرتبه 2 نیز در نظر گرفت. اگر m و n اعداد صحیح مثبت باشند، یعنی m,n\in \mathbb{Z} آنگاه ماتریس با ابعاد m در n شامل m\timesn المان یا عضو است که m تعداد سطرها و n تعداد ستونها است.

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

 

شکل 3- ماتریس دوبعدی m در n

 

در برخی موارد، به جای توصیف کامل اجزاء یک ماتریس، از عبارت زیر به عنوان خلاصه تعریف ماتریس استفاده میشود:

 

A=[a_{ij}]_{m\times n}

 

حال به عنوان مثال، در محیط برنامه‌نویسی پایتون و به کمک کتابخانه یا ماژول numpy، یک ماتریس ساخته و ابعاد آن را بررسی میکنیم:

 

کد پایتون:

 

# Create a matrix

import numpy as np

matrix = np.array([[45,34],[67,58]])

# Check the dimension of matrix

print(“The original matrix is given by \n”, matrix)

print(“The dimension of the matrix is “, matrix.ndim)

 

خروجی:

 

The original matrix is given by

[[45 34]

[67 58]]

The dimension of the matrix is 2

 

 

جمع و تفریق ماتریسها

 

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

 

شکل 4- عمل جمع و تفریق ماتریسها

 

کد پایتون برای عمل جمع و تفریق و نتیجه آن به شرح زیر است:

 

matrix_1 = np.array([[45,34],[67,58]])

matrix_2 = np.array([[35,24],[57,48]])

# Add the two matrices

print(“The result after adding matrix 1 and matrix 2 is given by n” , np.add(matrix_1, matrix_2))

# Subtract one matrix from the other matrices

print(“The result after subtracting matrix 1 from matrix 2 is given by n” , np.subtract(matrix_1, matrix_2))

print(“The result after subtracting matrix 2 from matrix 1 is given by n” , np.subtract(matrix_2, matrix_1))

 

خروجی:

 

The result after adding matrix 1 and matrix 2 is given by  [[ 80  58] [124 106]]

The result after subtracting matrix 1 from matrix 2 is given by  [[10 10] [10 10]]

The result after subtracting matrix 2 from matrix 1 is given by  [[-10 -10] [-10 -10]]

 

 

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

 

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

 

کد پایتون:

 

matrix = np.array([[45,34,75],[67,58,89]])

# Finding number of rows and columns in the matrix

print(“The number of rows and columns in the given matrix are “str(matrix.shape[0]) + ” and “ + str(matrix.shape[1]) + respectively”)

# Number of elements in the matrix

print(“The size of the given matrix is” , matrix.size) 

 

خروجی:

 

The number of rows and columns in the given matrix are 2 and 3 respectively

The size of the given matrix is 6

 

 

تبدیل یک ماتریس فشرده با ماتریس تنک

 

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

 

شکل 5- ماتریس تنک و فشرده

 

کد پایتون:

 

from scipy import sparse

# Create a Dense Matrix

dense_matrix = np.array([[0,0],[0,17],[78,0]])

# Convert Dense matrix to Sparse matrix

sparse_matrix = sparse.csr_matrix(dense_matrix)

print(“The sparse matrix corresponding to a given dense matrix is given by n” , sparse_matrix)

 

خروجی:

 

The sparse matrix corresponding to a given dense matrix is given by    

(1, 1)     17 

(2, 0)      78

 

 

ترانهاده ماتریس

 

در ترانهاده ماتریس، سطرها به ستون و ستونها به سطر تبدیل میشوند. از این طریق یک ماتریس سطری نیز به ستونی و بالعکس تبدیل میشود.

اگر ماتریس A=[a_{ij}]_{m\times n} را داشته باشیم، ترانهاده آن A^T=[a_{ji}]_n\times m است.

 

شکل 6- ترانهاده ماتریس

 

کد پایتون:

 

import numpy as np

matrix = np.array([[45,34],[67,58]])

print(“The original matrix is given by n” , matrix)

print(“The transpose matrix of the given matrix is n” , matrix.T)

 

خروجی:

 

The original matrix is given by  

[[45 34]

[67 58]]

The transpose matrix of the given matrix is  

[[45 67]

[34 58]]

 

 

میانگین، واریانس و انحراف معیار یک ماتریس

 

در این بخش، برخی اطلاعات آماری مربوط به یک ماتریس بدست می‌آیند. در اینجا، میانگین، واریانس و انحراف معیار ماتریس با کمک numpy محاسبه میشوند.

 

کد پایتون:

 

import numpy as np

matrix = np.array([[45,34],[67,58], [23,89]])

# Finding the mean of a matrix elements

print(“The mean of the elements of a matrix is equal to”, np.mean(matrix))

# Finding the Variance of a matrix elements

print(“The variance of the elements of a matrix is equal to”, np.var(matrix))

# Finding the Standard Deviation of a matrix elements

print(“The standard deviation of the elements of a matrix is equal to”, np.std(matrix))

print(“The standard deviation of the elements of a matrix is equal to”, np.sqrt(np.var(matrix)))

 

خروجی:

 

The mean of the elements of a matrix is equal to 52.666666666666664

The variance of the elements of a matrix is equal to 473.5555555555555

The standard deviation of the elements of a matrix is equal to 21.761331658599286

The standard deviation of the elements of a matrix is equal to 21.761331658599286 

 

 

اثر ماتریس:

 

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

 

شکل 7 – اثر ماتریس

 

کد پایتون:

 

import numpy as np

matrix = np.array([[1,2,3],[4,5,6], [7,8,9]])

# Get the diagonal elements of a matrix

print(“The diagonal elements of a given matrix are n”, matrix.diagonal())

# Finding the trace of the matrix

print(“The trace of a given matrix is equal to”, matrix.diagonal().sum())

 

خروجی:

 

The diagonal elements of a given matrix are  

[1 5 9]

The trace of a given matrix is equal to 15

 

 

یافتن المانهای حداقل و حداکثر یک ماتریس

 

در این بخش، یافتن مقادیر حداقل و حداکثر از میان المانهای یک ماتریس انجام میشود.

 

کد پایتون:

 

import numpy as np

matrix = np.array([[1,2,3],[4,5,6], [7,8,9]])

# Find the minimum element of the matrix

print(“The minimum element in a given matrix is”, np.min(matrix))

# Find the maximum element of the matrix

print(“The maximum element in a given matrix is”, np.max(matrix))

خروجی:

 

The minimum element in a given matrix is 1

The maximum element in a given matrix is 9

 

 

دترمینان یک ماتریس

 

در این بخش، محاسبه دترمینان یک ماتریس انجام میشود. برای محاسبه دترمینان، از ماژول جبرخطی در numpy استفاده میشود

 

شکل 8- دترمینان ماتریسها

 

کد پایتون:

 

import numpy as np

matrix = np.array([[1,2,4],[3,4,6], [7,8,5]])

# Find the determinant of the matrix

print(“The determinant of the given matrix is equal to”, np.linalg.det(matrix))

خروجی:

 

The determinant of the given matrix is equal to 9.999999999999993

 

 

ضرب ماتریس

 

ماتریس A با شکل m در n ضرب در ماتریس B با شکل n در p، به ماتریس C با شکل m در p منجر میشود. در حین ضرب ماتریسها در هم، تعداد ستونهای اولین ماتریس باید با تعداد سطرهای دومین ماتریس برابر باشند. در غیر این صورت، عمل ضرب با خطا مواجه خواهد شد.

 

شکل 9- ضرب ماتریسها

 

در این بخش، ضرب دو ماتریس در هم محاسبه میشوند.

 

کد پایتون:

import numpy as np

matrix_1 = np.array([[45,34],[67,58]])

matrix_2 = np.array([[35,24],[57,48]])

print(“The matrix multiplication of given two matrices is given by n”, np.matmul(matrix_1, matrix_2))

 

خروجی:

 

The matrix multiplication of given two matrices is given by

 [[3513 2712]

 [5651 4392]]

 

دقت کنید که علامت * در پایتون (برخلاف متلب)، ضرب ماتریسی نیست و این کار را به صورت عضو-محور انجام میدهد.

 

 

عملیات عضو-محور با استفاده از تابع درون-خطی (inline function) تحت عنوان lambda

 

در این مثال، جمع با یک مقدار اسکالر به صورت عضو-محور انجام میشود.

 

کد پایتون:

 

import numpy as np

matrix = np.array([[1,2,4],[3,4,6], [7,8,5]])

addition = lambda i:i+5

add_5_vec = np.vectorize(addition)

print(“The matrix after adding 5 to all its elements is n”, add_5_vec(matrix))

 

خروجی:

 

The matrix after adding 5 to all its elements is

 [[ 6  7  9]

 [ 8  9 11]

 [12 13 10]]

 

لازم به ذکر است که جمع ساده x+a نیز المانهای ماتریس x را با مقدار اسکالر a جمع میکند ولی روش بالا جامع‌تر است و قابلیت تعمیم به بسیاری از عملیات دیگر را نیز داد. همچنین x*a نیز ضرب عضو-محور a در المانهای x را انجام میدهد.

 

 

معکوس یک ماتریس

 

در این بخش، نحوه یافتن معکوس ماتریس بررسی میشود.

 

کد پایتون:

 

import numpy as np

matrix = np.array([[1,2,4],[3,4,6], [7,8,5]])

# Finding the inverse of a matrix

print(“The inverse matrix of a given matrix is n”, np.linalg.inv(matrix))

 

خروجی:

 

The inverse matrix of a given matrix is

 [[-2.8  2.2 -0.4]

 [ 2.7 -2.3  0.6]

 [-0.4  0.6 -0.2]]

 

 

تغییر شکل یک ماتریس (reshape)

 

در این بخش، تغییر شکل یک ماتریس ارائه میگردد. البته لازم به ذکر است که در اینجا اندازه ماتریس (تعداد کل المانها) ثابت میماند.

 

کد پایتون:

 

import numpy as np

matrix = np.array([[1,2,4],[3,4,6],[7,8,5],[9,2,1]])

print(“The reshaped matrix is given by n”, matrix.reshape(6,2))

 

خروجی:

 

The reshaped matrix is given by

 [[1 2]

 [4 3]

 [4 6]

 [7 8]

 [5 9]

 [2 1]]

 

 

 

 

 

منبع: www.analyticsvidhya.com