الگوریتم یادگیری ماشین به یک کد برنامه (ریاضی یا منطق برنامه) اشاره دارد که متخصصان را قادر می سازد تا مجموعه های داده پیچیده بزرگ را مطالعه، تجزیه و تحلیل، درک و کاوش کنند. هر الگوریتم از یک سری دستورالعمل پیروی می کند تا با یادگیری، ایجاد و کشف الگوهای تعبیه شده در داده ها، به هدف پیش بینی یا طبقه بندی اطلاعات دست یابد.
انواع یادگیری ماشینی
الگوریتمهای یادگیری ماشینی قوانین و فرآیندهایی را مشخص میکنند که یک سیستم باید هنگام رسیدگی به یک مشکل خاص در نظر بگیرد. این الگوریتم ها داده ها را برای پیش بینی نتیجه در محدوده از پیش تعیین شده تجزیه و تحلیل و شبیه سازی می کنند. علاوه بر این، با وارد شدن داده های جدید به این الگوریتم ها، آنها بر اساس بازخورد عملکرد قبلی در پیش بینی نتایج، یاد می گیرند، بهینه می شوند و بهبود می یابند. به عبارت ساده، الگوریتمهای یادگیری ماشین با هر تکرار «هوشمندتر» میشوند.
بسته به نوع الگوریتم، مدل های یادگیری ماشین از پارامترهای مختلفی مانند پارامتر گاما، max_depth، n_neighbors و سایر پارامترها برای تجزیه و تحلیل داده ها و تولید نتایج دقیق استفاده می کنند. این پارامترها نتیجه داده های آموزشی هستند که مجموعه داده بزرگتری را نشان می دهند.
الگوریتم های یادگیری ماشینی بر اساس تکنیک های یادگیری به چهار نوع طبقه بندی می شوند: تحت نظارت، نیمه نظارتی، بدون نظارت و یادگیری تقویتی. الگوریتمهای رگرسیون و طبقهبندی محبوبترین گزینهها برای پیشبینی مقادیر، شناسایی شباهتها و کشف الگوهای دادههای غیرعادی هستند.
1. یادگیری تحت نظارت
الگوریتم های یادگیری نظارت شده از مجموعه داده های برچسب گذاری شده برای پیش بینی استفاده می کنند. این تکنیک یادگیری زمانی مفید است که نوع نتیجه یا نتیجه ای را که قصد دارید داشته باشید، بدانید.
به عنوان مثال، در نظر بگیرید که یک مجموعه داده دارید که بارانی را که در یک منطقه جغرافیایی در طول یک فصل خاص در طول 200 سال گذشته رخ داده است، مشخص می کند. شما قصد دارید باران مورد انتظار در آن فصل خاص برای ده سال آینده را بدانید. در اینجا، نتیجه بر اساس برچسبهای موجود در مجموعه داده اصلی، یعنی بارندگی، منطقه جغرافیایی، فصل و سال به دست میآید.
2. یادگیری بدون نظارت
الگوریتم های یادگیری بدون نظارت از داده های بدون برچسب استفاده می کنند. این تکنیک یادگیری، داده های بدون برچسب را با دسته بندی داده ها یا بیان نوع، شکل یا ساختار آن برچسب گذاری می کند. این تکنیک زمانی مفید است که نوع نتیجه ناشناخته باشد.
به عنوان مثال، وقتی از مجموعه دادهای از کاربران فیسبوک استفاده میکنید، قصد دارید کاربرانی را که تمایل دارند (بر اساس لایکها) نسبت به کمپینهای تبلیغاتی مشابه فیسبوک طبقهبندی کنید. در این مورد، مجموعه داده بدون برچسب است. با این حال، نتیجه دارای برچسب هایی خواهد بود زیرا الگوریتم شباهت هایی را بین نقاط داده در حین طبقه بندی کاربران پیدا می کند.
3. یادگیری نیمه نظارتی (SSL)
الگوریتمهای یادگیری نیمهنظارتی دو مورد بالا را ترکیب میکنند، جایی که از دادههای برچسبدار و بدون برچسب استفاده میشود. هدف این الگوریتم ها دسته بندی داده های بدون برچسب بر اساس اطلاعات به دست آمده از داده های برچسب دار است.
مثالی از طبقه بندی محتوای وب را در نظر بگیرید. طبقهبندی و طبقهبندی محتوای موجود در اینترنت یک کار زمانبر و منابع فشرده است. جدا از الگوریتم های هوش مصنوعی، برای سازماندهی میلیاردها صفحه وب در دسترس به صورت آنلاین، به منابع انسانی نیاز دارد. در چنین مواردی، مدلهای SSL میتوانند نقش مهمی در انجام کارها به نحو احسن ایفا کنند.
4. یادگیری تقویتی
الگوریتم های یادگیری تقویتی از نتیجه یا نتیجه به عنوان معیاری برای تصمیم گیری در مرحله اقدام بعدی استفاده می کنند. به عبارت دیگر، این الگوریتمها از نتایج قبلی یاد میگیرند، پس از هر مرحله بازخورد دریافت میکنند و سپس تصمیم میگیرند که آیا مرحله بعدی را ادامه دهند یا خیر. سیستم میآموزد که آیا در این فرآیند انتخاب درست، اشتباه یا خنثی کرده است. سیستمهای خودکار میتوانند از یادگیری تقویتی استفاده کنند، زیرا برای تصمیمگیری با حداقل دخالت انسان طراحی شدهاند.
به عنوان مثال، شما یک خودروی خودران طراحی می کنید و قصد دارید ردیابی کنید که آیا خودرو از قوانین راهنمایی و رانندگی پیروی می کند و ایمنی در جاده ها را تضمین می کند. با استفاده از یادگیری تقویتی، وسیله نقلیه از طریق تجربه و تاکتیک های تقویتی یاد می گیرد. این الگوریتم تضمین میکند که خودرو از قوانین راهنمایی و رانندگی برای ماندن در یک لاین پیروی میکند، از محدودیتهای سرعت پیروی میکند و از برخورد با عابران پیاده یا حیوانات در جاده جلوگیری میکند.
به نظر می رسد تصور غلط زیادی از سوی بسیاری از توسعه دهندگان مشتاق وجود دارد که به خاطر سپردن الگوریتم های استاندارد مهم است. اکنون برای برخی از مصاحبه های شغلی که ممکن است چنین باشد، اما برای اینکه واقعاً یک توسعه دهنده موفق باشید، اهمیت خاصی ندارد.
پس آیا چیزهایی که در کلاس الگوریتم یاد می گیرید بی فایده هستند؟ قطعا نه. آنچه فوق العاده مهم است توانایی تفکر الگوریتمی است. نه فقط برای اینکه بتوانید الگوریتمهای استاندارد را بازتولید کنید، بلکه برای اینکه از کد برای حل مشکلاتی که بهعنوان یک توسعهدهنده با آن مواجه میشوید راحت باشید.
به همین دلیل است که من فهرستی از 10 الگوریتم را گردآوری کردهام که توسعهدهندگان مشتاق باید از طریق آنها کار کنند تا الگوریتمی فکر کنند.
1. جستجوی باینری
جستجوی باینری یکی از اولین چیزهایی است که در هر کلاس علوم کامپیوتر تدریس می شود. شاید این سادهترین مثال باشد که نشان میدهد چگونه اندکی نبوغ میتواند کارها را، به معنای واقعی کلمه، به طور تصاعدی کارآمدتر کند.
جستجوی دودویی شامل گرفتن یک آرایه مرتب شده، و تقسیم مکرر آرایه به دو قسمت و مقایسه عنصری است که به دنبال آن هستید با هر نیمه، تا زمانی که عنصر را پیدا کنید.
2. Selection، Bubble و Insertion Sort
الگوریتم های مرتب سازی یکی از اساسی ترین ابزارهایی هستند که یک توسعه دهنده باید در زرادخانه خود داشته باشد. انتخاب، حباب، و مرتب سازی درج از اولین مواردی هستند که توسعه دهندگان جدید باید از طریق آنها کار کنند. در هر سناریویی که سرعت اهمیت دارد، از این الگوریتمها استفاده نمیکنید، اما کار با آنها مقدمهای عالی برای پیمایش و دستکاری آرایه است.
3. Quicksort و Mergesort
مشابه شماره ۲، الگوریتمهای مرتبسازی برای راحتتر شدن با آرایهها عالی هستند، اما Quicksort و Mergesort به اندازهای کارآمد هستند که در برنامههای کاربردی جدی مورد استفاده قرار گیرند. راحت بودن در اجرای این الگوریتمهای مرتبسازی (توجه داشته باشید "راحت بودن" و "به خاطر سپردن") این الگوریتمها برای یک توسعهدهنده جدی ضروری هستند.
4. کدنویسی هافمن
کدنویسی هافمن اساس فشرده سازی متن مدرن است. این با در نظر گرفتن تعداد دفعات ظاهر شدن کاراکترهای مختلف در یک متن کار می کند و آنها را در یک درخت بر اساس این فرکانس سازماندهی می کند.
5. جستجوی اول سطح
دوباره، درختان در قلب بسیاری از الگوریتم ها و نرم افزارهایی هستند که توسعه دهندگان با آنها کار می کنند. به این ترتیب، درک پیمایش اولیه درخت برای یک توسعه دهنده مشتاق اولویت اصلی است.
جستجوی اول سطح با کاوش یک درخت در سطح به سطح کار می کند تا زمانی که گره هدف پیدا شود. از آنجایی که به معنای واقعی کلمه از هر سطحی عبور می کند، مطمئناً راه حلی پیدا می کند
6. Depth First Search
در ادامه پیمایش درخت، Depth-First Search روش اصلی دیگر برای یافتن یک عنصر در درخت است. به جای اینکه سطح درخت را پایین بیاورد، شاخه به شاخه درخت را بررسی می کند.
اکنون با فرض اینکه شاخه های بی نهایت گسترده ای نداشته باشد، DFS به طور مشابه همیشه کار خواهد کرد. پیادهسازی این دو الگوریتم جستجو چندان پیچیده نیست، اما آنچه بسیار مهم است، یادگیری زمان استفاده از یکی بر دیگری است. بسیاری از طراحیهای نرمافزاری قادر به درک ساختار اطلاعاتی هستند که با آن کار میکنید و الگوریتمهایی را انتخاب میکنند که برای آن ساختار بهینه میشوند.
7. گرادیان نزول
اکنون برای بسیاری از توسعه دهندگان، Gradient Descent لزوما مفید نخواهد بود. با این حال، اگر چیزی را با رگرسیون یا یادگیری ماشین لمس می کنید، Gradient Descent در قلب کار شما خواهد بود.
Gradient Descent روشی برای بهینهسازی توابع با استفاده از حساب دیفرانسیل و انتگرال است. در زمینه رگرسیون و یادگیری ماشینی، این به معنای یافتن مقادیر خاصی است که خطا را در الگوریتم پیشبینی شما به حداقل میرساند. در حالی که مطمئناً بسیاری از این الگوریتمهای دیگر از نظر ریاضی بیشتر درگیر هستند، اگر به طور قابل توجهی با دادهها و پیشبینیها کار میکنید، درک نحوه عملکرد نزول گرادیان بسیار مهم است.
8. الگوریتم دایجسترا
یکی دیگر از مسائل بسیار مهمی که توسعه دهندگان با آن کار می کنند، مسیریابی است. نمودارها راهی فوق العاده همه کاره برای توصیف انواع مشکلاتی هستند که شبکه هایی از اشیاء متمایز را در بر می گیرند.
الگوریتم Dijkstra راهی برای یافتن سریعترین مسیر بین دو گره در یک گراف است. این پایه و اساس اکثر کارهای انجام شده در مسیریابی است و خود را در هر چیزی از هوش مصنوعی گرفته تا طراحی بازی مورد استفاده قرار می دهد.
9. تبادل کلید Diffie-Hellman
تبادل کلید Diffie-Hellman مقدمه ای عالی برای چگونگی کارکرد رمزنگاری است. به طور خاص، تبادل کلید Diffie-Hellman با ترکیب کلیدهای عمومی و خصوصی (که در واقع اعداد طولانی هستند) برای رمزگذاری اطلاعات هنگام انتقال بین طرف های مختلف کار می کند.
حتی اگر در زمینه امنیت سایبری کار نمی کنید، داشتن درک درست از رمزگذاری و ارتباطات ایمن برای کار به عنوان یک توسعه دهنده بسیار مهم است. علاوه بر این، حتی اگر Diffie-Hellman از بهترین الگوریتم فاصله دارد، پیاده سازی آن فوق العاده آسان است و به اندازه کافی شبیه به سایر روش های ارتباطی رمزگذاری شده است.
10. انجام مسائل تمرینی
این نه الگوریتم اول همگی راه هایی را برای حل کهن الگوهای مشکلاتی که ممکن است به عنوان یک توسعه دهنده با آن مواجه شوید، به شما ارائه می دهند. با این حال، واقعیت این است که به عنوان یک توسعهدهنده اغلب با مشکلات الگوریتمی کاملاً جدید مواجه میشوید. به همین دلیل است که مهمتر از به خاطر سپردن هر الگوریتم، توسعه توانایی حل مسائل به صورت الگوریتمی است.
خوشبختانه، هیچ کمبودی در وب سایت برای تمرین وجود ندارد. برخی از موارد مورد علاقه ما عبارتند از:
اینها محیط های بسیار خوبی برای یافتن مشکلات الگوریتمی دشوار و در عین حال کامل هستند و مهارت های خود را تقویت می کنند.