مجموعه کامل کدها و پروژه‌های یادگیری ماشین و شناسایی الگو با MATLAB


اگر در پروژه‌های یادگیری ماشین (Machine Learning) فقط از توابع آماده برای اجرای الگوریتم‌هایی مانند SVM، KNN، PCA یا K-Means استفاده کرده باشید، احتمالاً یک سؤال مهم هنوز باقی مانده است: واقعاً در پشت این الگوریتم‌ها چه اتفاقی می‌افتد؟ در این مجموعه، تلاش کرده‌ام پاسخ این سؤال را با پیاده‌سازی الگوریتم‌های یادگیری ماشین و شناسایی الگو از صفر (From Scratch) نشان دهم. در Repository آموزشی Machine Learning & Pattern Recognition from Scratch، الگوریتم‌های کلاسیک یادگیری ماشین با MATLAB و بدون تکیه بر توابع آماده پیاده‌سازی شده‌اند. مسیر کار از درک ریاضیات و منطق الگوریتم شروع می‌شود، به پیاده‌سازی دستی می‌رسد و سپس در قالب پروژه‌های عملی روی داده‌های مختلف بررسی می‌شود. 

راه یادگیری عمیق، از یادگیری ماشین می‌گذرد!
در دوره‌ای که تقریباً همه نگاه‌ها به سمت Deep Learning است، شاید یادگیری الگوریتم‌های کلاسیک Machine Learning کمی قدیمی به نظر برسد؛ اما اتفاقا همین مفاهیم پایه می‌توانند درک شما از مدل‌های عمیق را عمیق‌تر و اصولی‌تر کنند. به همین دلیل در این Repository تلاش کرده‌ام الگوریتم‌های مهم Machine Learning و Pattern Recognition را فقط با چند خط کد آماده اجرا نکنیم؛ بلکه آن‌ها را از منظر ریاضی و الگوریتمی بشناسیم و سپس از صفر پیاده‌سازی کنیم. چون وقتی پشت صحنه‌ی الگوریتم‌ها را بفهمید، استفاده از مدل‌های پیچیده‌تر دیگر فقط اجرای یک تابع آماده نیست؛ بلکه می‌دانید واقعاً چه چیزی در حال اتفاق افتادن است.

 

پیاده‌سازی الگوریتم‌های Machine Learning و Pattern Recognition از صفر در MATLAB

این مجموعه شامل ۲۰ الگوریتم پیاده‌سازی‌شده و تعداد زیادی پروژه عملی در حوزه‌هایی مانند Classification، Regression، Ensemble Learning، Dimensionality Reduction و Clustering است.

مشاهده Repository در GitHub

چرا یادگیری ماشین را از صفر پیاده‌سازی کنیم؟

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

یک تابع را فراخوانی می‌کنیم، داده را به آن می‌دهیم و در نهایت مدل و خروجی را دریافت می‌کنیم.

این روش برای انجام پروژه بسیار مفید است؛ اما یک سؤال مهم باقی می‌ماند:

آیا استفاده از یک الگوریتم به معنی فهمیدن آن الگوریتم است؟

به نظر من، نه لزوما.

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

  • مسئله بهینه‌سازی SVM دقیقاً چیست؟
  • Support Vectorها چگونه تعیین می‌شوند؟
  • Hard Margin و Soft Margin چه تفاوتی دارند؟
  • پارامترهای مدل چه اثری روی تصمیم‌گیری دارند؟
  • SVM با کرنل غیرخطی چطور عمل می‌کند؟
  • چرا عملکرد الگوریتم روی یک Dataset بهتر از Dataset دیگر است؟
  • یا حتی یک سوال جدی تر، مدل چه محدویتهایی دارد و من چطور میتوانم برطرف کنم؟

دیگر صرفا استفاده از یک تابع آماده کافی نیست.

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

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

به همین دلیل، در آموزش Machine Learning و Pattern Recognition همیشه این مسیر را دنبال کرده‌ام:

پروژه عملی→ آزمایش→پیاده‌سازی از صفر →درک الگوریتم →ریاضیات

این دقیقاً همان رویکردی است که در این Repository نیز دنبال شده است. (GitHub)

Machine Learning & Pattern Recognition From Scratch

این Repository مجموعه‌ای از کدهای آموزشی برای پیاده‌سازی الگوریتم‌های کلاسیک یادگیری ماشین و شناسایی الگو در MATLAB است.

الگوریتم‌ها صرفاً به‌صورت چند تابع جداگانه در اختیار شما قرار نگرفته‌اند. ساختار Repository از مباحث اصلی یادگیری ماشین تشکیل شده و در کنار الگوریتم‌ها، پروژه‌هایی برای مشاهده رفتار آن‌ها روی مسائل مختلف نیز ارائه شده است. (GitHub)

چهار بخش اصلی Repository عبارت‌اند از:

  1. Classification & Regression
  2. Ensemble Learning
  3. Dimensionality Reduction
  4. Clustering

در مجموع، Repository شامل ۲۰ الگوریتم از صفر و ۱۶+ پروژه عملی است. (GitHub)

الگوریتمهای طبقه بندی و رگرسیون (Classification و Regression)  

یکی از مهم‌ترین بخش‌های یادگیری ماشین، ساخت مدلی است که بتواند بر اساس داده‌های موجود، یک کلاس را تشخیص دهد یا یک مقدار را پیش‌بینی کند.

در بخش Classification و Regression، چند گروه از الگوریتم‌های کلاسیک را از پایه پیاده‌سازی کرده‌ام.

طبقه‌بندهای بیزی و پارامتری

طبقه بند بیزین

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

موضوعات این بخش شامل:

  • Bayesian / Naive Bayes Classifier
  • Maximum Likelihood
  • Euclidean Distance
  • Mahalanobis Distance

هدف این بخش فقط اجرای یک Classifier نیست؛ بلکه ایجاد درکی از این موضوع است که چگونه توزیع داده و فاصله میان نمونه‌ها می‌تواند به تصمیم‌گیری یک طبقه‌بند منجر شود. (Classification and Regression)

K-Nearest Neighbors و Weighted KNN

کد الگوریتم knn

KNN یکی از ساده‌ترین و در عین حال آموزنده‌ترین الگوریتم‌های یادگیری ماشین است.

در این Repository، KNN و نسخه Weighted آن برای هر دو مسئله Classification و Regression پیاده‌سازی شده‌اند.

این پیاده‌سازی کمک می‌کند مفهوم Distance-Based Learning را نه فقط در سطح تعریف، بلکه در سطح محاسبات و کد مشاهده کنید. (KNN and Weighted KNN)

ماشین بردار پشتیبان (Support Vector Machine و Support Vector Regression

کد پیاده سازی ماشین بردار پشتیبان

SVM یکی از مهم‌ترین الگوریتم‌های کلاسیک در شناسایی الگو و یادگیری ماشین است.

در این بخش، پیاده‌سازی شامل:

  • Binary SVM
  • Hard-Margin SVM
  • Soft-Margin SVM
  • One-vs-One
  • One-vs-Rest
  • Support Vector Regression (SVR)

است. (SVM and SVR)

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

یادگیری جمعی (Ensemble Learning) 

کد الگوریتمهای یادگیری جمعی

گاهی اوقات یک مدل به‌تنهایی بهترین تصمیم ممکن را ارائه نمی‌دهد.

ایده اصلی Ensemble Learning این است که چند مدل یا چند تصمیم را با یکدیگر ترکیب کنیم و از این طریق به یک تصمیم نهایی قدرتمندتر برسیم.

در این بخش چهار روش اصلی پیاده‌سازی شده‌اند:

Voting

ترکیب تصمیم چند Classifier برای رسیدن به خروجی نهایی.

Stacking

استفاده از چند مدل مختلف و ترکیب خروجی آن‌ها توسط یک مدل نهایی.

AdaBoost

روشی از خانواده Boosting که مدل‌ها را به‌صورت متوالی ترکیب می‌کند تا تمرکز بیشتری روی نمونه‌های دشوار ایجاد شود.

Bootstrap Bagging

استفاده از نمونه‌گیری Bootstrap و ترکیب مدل‌ها برای ایجاد یک Ensemble. کد (Ensemble Learning)

این بخش فرصت خوبی برای درک تفاوت میان مدل منفرد و Ensemble Model و همچنین مفاهیم Bagging و Boosting فراهم می‌کند.

کاهش بعد (Dimensionality Reduction) 

پیاده سازی الگوریتم pca lda

وقتی تعداد ویژگی‌های یک Dataset زیاد می‌شود، کار با داده و مشاهده ساختار آن دشوارتر خواهد شد.

در کاهش بعد (Dimensionality Reduction) تلاش می‌کنیم داده را به فضای کم‌بعدتری منتقل کنیم، بدون اینکه اطلاعات مهم آن را تا حد امکان از دست بدهیم.

در این Repository دو روش مهم بررسی شده‌اند:

PCA — Principal Component Analysis

PCA یکی از شناخته‌شده‌ترین روش‌های کاهش بعد است.

در این پیاده‌سازی، PCA از پایه اجرا شده تا بتوان فرآیند پیدا کردن مؤلفه‌های اصلی و انتقال داده به فضای جدید را بهتر درک کرد. (Dimensionality Reduction)

LDA — Linear Discriminant Analysis

LDA یا Fisher Discriminant Analysis برخلاف PCA از اطلاعات مربوط به کلاس‌ها نیز استفاده می‌کند.

قرار دادن PCA و LDA در کنار یکدیگر، فرصت خوبی برای درک تفاوت میان روش‌های کاهش بعد بدون استفاده از برچسب کلاس و روش‌های Class-Aware فراهم می‌کند.

خوشه بندی (Clustering) 

پیاده سازی الگوریتمهای خوشه بندی

همیشه برای داده‌ها Label نداریم. در بسیاری از مسائل، باید بتوانیم بدون داشتن برچسب از پیش تعیین‌شده، ساختارهای موجود در داده را پیدا کنیم. اینجا وارد دنیای Unsupervised Learning و Clustering می‌شویم.

در این بخش سه الگوریتم پیاده‌سازی شده‌اند:

K-Means

یکی از معروف‌ترین الگوریتم‌های Clustering که نمونه‌ها را بر اساس فاصله نسبت به Centroidها در گروه‌های مختلف قرار می‌دهد.

Fuzzy C-Means

در FCM، برخلاف K-Means، یک نمونه الزاماً متعلق به تنها یک Cluster نیست و می‌تواند درجات مختلفی از Membership داشته باشد.

G-Means

روشی برای تعیین تعداد مناسب‌تر Clusterها با استفاده از یک رویکرد آماری. (Clustering)

قرار گرفتن این سه روش در کنار یکدیگر، امکان مقایسه رویکردهای مختلف برای Clustering را فراهم می‌کند.


بخش مهم‌تر: وقتی الگوریتم‌ها وارد پروژه می‌شوند

به نظرم یادگیری یک الگوریتم زمانی جدی‌تر می‌شود که از فضای تئوری خارج شویم و ببینیم:

این الگوریتم واقعاً کجا به درد می‌خورد؟

به همین دلیل، در کنار پیاده‌سازی الگوریتم‌ها، بیش از ۱۶ پروژه عملی در Repository قرار گرفته است. (GitHub)

پروژه عملی یادگیری ماشین و شناسایی الگو

🌸 طبقه‌بندی گل Iris 

کد پروژه تشخیص گل زنبق

در این پروژه از روش‌های مختلف Classification مانند روش‌های پارامتری، KNN، Weighted KNN، SVM و Ensemble Methods برای بررسی داده Iris استفاده شده است. (GitHub)

🩺 طبقه‌بندی سرطان سینه

کد پرژه تشخیص سرطان با یادگیری ماشین

یک مسئله Classification پزشکی با استفاده از Binary SVM و Stacking Ensemble که نشان می‌دهد الگوریتم‌های کلاسیک Machine Learning چگونه می‌توانند روی داده‌های پزشکی به کار گرفته شوند. (GitHub)

🌫پیش‌بینی کیفیت هوا

کد پروژه تخمین کیفیت هوا با یادگیری ماشین

در این پروژه از KNN Regression، Weighted KNN Regression و Support Vector Regression برای یک مسئله Regression استفاده شده است. (GitHub)

💪 تخمین زاویه مفصل مچ پا از sEMG

کد پروژه تخمین زاویه مفصل مچ پا از sEMG

در این پروژه از Support Vector Regression برای تخمین زاویه مفصل بر اساس داده‌های surface EMG استفاده شده است؛ نمونه‌ای از ارتباط Machine Learning با Biomedical Signal Processing. (GitHub)

🧠 Neural Spike Sorting

کد پروژه spike sorting

در این پروژه از PCA، K-Means، Fuzzy C-Means و G-Means برای تحلیل داده‌های Neural Spike استفاده شده است. (GitHub)

🩻 استخراج تومور از تصاویر پزشکی

کد پروژه استخراج تومور از تصاویر پزشکی

در این پروژه از K-Means و Fuzzy C-Means برای استخراج نواحی موردنظر در تصاویر پزشکی استفاده شده است. (GitHub)

این پروژه‌ها کمک می‌کنند یک نکته مهم را ببینیم:

دانستن الگوریتم یک چیز است؛ دانستن اینکه چه زمانی و چگونه از آن استفاده کنیم، چیز دیگری است.



اگر دانشجوی Machine Learning هستید، از کجا شروع کنید؟

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

یک مسیر مناسب می‌تواند این باشد:

Classification → Regression → KNN → SVM → Ensemble Learning → Dimensionality Reduction → Feature Selection → Clustering → Projects

در این مسیر، فقط الگوریتم را حفظ نکنید.

برای هر الگوریتم سعی کنید به این پنج سؤال پاسخ دهید:

  1.  مسئله‌ای که حل می‌کند چیست؟
  2. ریاضیات و فرضیات آن چیست؟
  3.  چگونه می‌توان آن را از صفر پیاده‌سازی کرد؟
  4.  نقاط قوت و محدودیت‌های آن چیست؟
  5.  چطور می‌توان از آن در پروژه های عملی استفاده کرد؟

اگر این پنج مورد را درباره یک الگوریتم بدانید، دیگر صرفاً کاربر آن الگوریتم نیستید؛ آن را فهمیده‌اید.

یادتان باشد، اگر از الگوریتمی که یاد گرفته اید، نتونید در پروژه های عملی استفاده کنید، عملا اونو یاد نگرفته اید! پس تا میتونید در پروژه های مختلف استفاده کنید تا درک عمیقی از الگوریتم، از کاربردهاش و چالشهای واقعی در عمل بدست بیارید.



چرا MATLAB؟

در این Repository، پیاده‌سازی‌ها با MATLAB انجام شده‌اند.

دلیل این انتخاب، صرفاً زبان برنامه‌نویسی نیست. MATLAB برای آموزش مفاهیم ریاضی، کار با ماتریس‌ها، Visualization و بررسی مرحله‌به‌مرحله الگوریتم‌ها محیط بسیار مناسبی فراهم می‌کند.

هدف این پروژه نیز ایجاد یک Library آماده برای جایگزین کردن ابزارهای استاندارد نیست.

هدف اصلی، آموزش منطق الگوریتم از طریق کدنویسی است.

یعنی به‌جای اینکه فقط بدانیم: KNN(…) یا PCA(…) چه خروجی‌ای می‌دهد، یک بار خودمان ببینیم پشت این نام‌ها چه محاسباتی اتفاق می‌افتد.



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

این کدها بخشی از مسیری هستند که در دوره‌های Machine Learning و Pattern Recognition دنبال کرده‌ام.

در آموزش‌ها، تلاش کرده‌ام مسیر از مفهوم و ریاضیات شروع شود، سپس به پیاده‌سازی دستی الگوریتم برسد و در ادامه با استفاده از ابزارها و پروژه‌های عملی، کاربرد آن بررسی شود.

به همین دلیل، این Repository را صرفاً یک مجموعه کد نمی‌دانم؛ بلکه آن را مکملی برای دانشجویی می‌دانم که می‌خواهد هنگام یادگیری یک الگوریتم، بتواند کد آن را باز کند، خط‌به‌خط بررسی کند، تغییر دهد و نتیجه تغییرات را ببیند.

مشاهده دوره‌های Machine Learning و Pattern Recognition در OnlineBME

کدها را بخوانید، اجرا کنید و تغییر دهید

اگر دانشجوی Machine Learning، Pattern Recognition، مهندسی پزشکی، مهندسی برق، مهندسی کامپیوتر یا علوم داده هستید، پیشنهاد می‌کنم فقط Repository را Bookmark نکنید!

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

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

Machine Learning & Pattern Recognition From Scratch — MATLAB در GitHub



یک نکته‌ای که همیشه به دوستانم می‌گویم

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

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

اگر می‌خواهید یک الگوریتم را بهتر استفاده کنید، یک بار خودتان آن را بسازید.

🔗 منابع و لینک‌های مرتبط

Repository کدهای Machine Learning و Pattern Recognition:
GitHub Repository

دوره‌های تخصصی Machine Learning و Pattern Recognition:
دوره‌های OnlineBME


دیدگاه ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

code