مطالب
الگوریتم‌های داده کاوی در SQL Server Data Tools یا SSDT - قسمت ششم (آخرین قسمت) - الگوریتم‌ Neural Network و Logistic Regression

در  قسمت قبل با الگوریتم Association Rules که بیشتر برای تحلیل سبد خرید استفاده می‌شد، آشنا شدیم. در این قسمت که قسمت آخر از سری مقالات الگوریتم‌های داده کاوی در SSDT می‌باشد، با الگوریتم‌های Neural Network و Logistic Regression آشنا می‌شویم.


Neural Network (هوش مصنوعی)

مقدمه

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



توصیف الگوریتم

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

پیچیدگی تحلیل انجام شده توسط این الگوریتم به دو عامل بر می‌گردد:

  1. ممکن است یک یا تمام ورودی‌ها به طریقی با یک یا همه‌ی خروجی‌ها مرتبط باشند و الگوریتم باید این موضوع را در آموزش مدل درنظر بگیرد.
  2. ممکن است ترکیبات مختلفی از ورودی‌ها به طریقی با خروجی‌ها در ارتباط باشند.

دسته بندی اسناد یکی از موضوعاتی است که شبکه‌های عصبی بهتر از الگوریتم‌های دیگر آن را حل می‌کنند. البته اگر سرعت برای ما مهم باشد، می‌توان از الگوریتم Naïve Bayes استفاده کرد. اما درصورتیکه دقت مهم‌تر باشد، آنگاه باید از الگوریتم شبکه‌های عصبی استفاده نمود.


تفسیر مدل

 نتیجه‌ی حاصله از این الگوریتم نسبت به الگوریتم‌های قبلی کاملا متفاوت است. در اینجا دیگر خبری از طرح محتوای مدل و نمودار گرافیکی لایه آموزش نیست. هدف اصلی در اینجا نمایش تاثیر صفت-مقدار، بر ویژگی قابل پیش بینی است. برای مثال جدول زیر در رابطه با تمایل به خرید یا اجاره خانه در رابطه با صفات مختلف می‌باشد. همانطور که مشخص است، دو ستون اول نشان دهنده‌ی جفت صفت-مقدار و دو ستون دوم، صفت مدنظر جهت پیش بینی را نشان می‌دهند. براساس این جدول می‌توان نتیجه گرفت که مهمترین فاکتور در تمایل به خریداری خانه، سن افراد می‌باشد. افرادی که سنی بین 38 تا 54 سال را دارند، بیشترین تمایل را در خرید یک خانه دارند. فاکتورهایی مانند متاهل بودن، سطح تحصیلات فوق دکترا، بازه سنی 33 تا 38  و خانم بودن نیز دارای اهمیت می‌باشند که به ترتیب از درجه اهمیت آن‌ها کم می‌شود. از طرفی بازه سنی 20 تا 28 سال بیشترین تمایل برای اجاره خانه را دارند. همچنین می‌توان گفت که افرادی که مجرد هستند، طلاق گرفته‌اند و یا سطح تحصیلاتشان دبیرستان است، بیشتر تمایل به اجاره خانه دارند تا به خرید آن.



Logistic Regression

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


به پایان آمد این دفتر، حکایت همچنان باقی است!

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

مطالب
درخت‌ها و گراف‌ها قسمت پنجم

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

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

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

درخت زیر را در نظر بگیرید؛ این درخت هم مانند سایر درخت‌ها با گره‌های شماره دار، نامگذاری شده است که تشخیص آن‌ها را برای ما آسان‌تر می‌سازد. در گراف، به گره‌ها راس یا vertice    هم می‌گویند. هر چند نام گره هم برای آن‌ها به کار برده می‌شود. به فلش‌هایی که به این رئوس اشاره می‌کنند، لبه‌های جهت دار directed edges  گفته می‌شود که در ویکی پدیا و کتب آموزشی فارسی، به آن‌ها یال اطلاق می‌شود . به یال هایی که از هر راس بیرون می‌آیند Predecessor گفته می‌شود که به معنی آغاز کننده است و به راسی که اشاره می‌کند، Successor گویند که به معنی ارث برنده یا جایگزین شناخته می‌شود. در شکل زیر عدد راس 19 آغاز کننده راس 1 است و 1 هم جایگزین یا ارث برنده 19 و اگر با دقت به شکل نگاه کنید می‌بینید که یک راس می‌تواند از چند راس ارث برنده باشد؛ مثل راس 21 .




برای نمایش گراف، ما از عبارت (V,E) استفاده می‌کنیم که V مجموعه‌ای از راس‌ها و E مجموعه‌ای از لبه‌هاست. هر لبه (که با e کوچک نمایش داده می‌شود) و در مجموعه E قرار دارد، پیوند دو راس v و u را نشان می‌دهد یا به عبارتی به صورت ریاضی می‌شود (e=(u,v .
برای اینکه مطالب را بهتر درک کنیم بهتر است که هر راس را یک شهر و هر لبه را یک جاده‌ی یک طرفه برای ارتباط با این راس‌ها فرض کنیم. مثلا اگر یکی از راس‌ها را تهران تصور کنیم و دیگری را کاشان، لبه یا جاده‌ی یک طرفه‌ای که این دو شهر را به هم متصل می‌کند، می‌شود جاده یا لبه‌ی تهران کاشان.

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

دو راسی که به وسیله‌ی یک یال به یکدیگر متصل می‌شوند را همسایه Neighbor می‌نامند. هر یال می‌تواند یک عدد برای خود داشته باشد که به این عدد وزن یال یا لبه می‌گویندWeight (Cost)   و در مثال بالا می‌توان گفت وزن هر یال می‌شود مسافت آن جاده؛ مسافتی که بین دو شهر همسایه باید طی شود. تصویر زیر یک گراف را نشان می‌دهد که وزن یال‌های آن در کنار هر یال نوشته شده است.


مسیر Path در گراف همانند درخت‌ها، طی کردن مسیری است که از یک راس به راس دیگر می‌رسد. در مثال بالا باید گفت که برای رسیدن از شهر مبدا به شهر مقصد، باید از چه شهرهایی عبور کرد. در شکل بالا مسیر 1 - 12 - 19 - 21 - 7 - 21 و 1 مسیر نیستند؛ چرا که راس 21 هیچ لبه‌ی آغاز کننده‌ای ندارد و بیشتر ارث برنده است.

طول Length هر مسیر هم تعداد یال‌هایی است که در طول مسیر قرار دارد یا تعداد راس‌ها منهای یک؛ به این مثال دقت کنید:

مسیر 1 -12-19-21 مسیری است که طول آن سه می‌باشد.

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

حلقه Loop مسیری است که راس اولیه با راس نهایی یکی باشد. نمونه‌ی آن مسیر 1-12-19-1 می‌باشد. ولی مسیر 1-7-21 حلقه‌ای تشکیل نمی‌دهد.

لبه‌ی حلقه ای Looping Edge لبه‌ای است که مبداء یا آغاز کننده‌ی آن با مقصد یا ارث برنده‌ی آن یکی باشد. یعنی به راسی وصل شود که از همان، آغاز شده است. مثل لبه‌ی متصل به راس 14.


یک کلاس گراف به چه مواردی نیاز دارد:

عملیات ایجاد گراف

افزودن و حذف یک راس یا لبه

بررسی اینکه بین دو راس لبه ای وجود دارد یا خیر

جست و جوی جانشین‌های یک راس


در قسمت آینده کد آن را در سی شارپ پیاده سازی خواهیم کرد.

نظرات مطالب
توسعه سیستم مدیریت محتوای DNTCms - قسمت اول
ممنونم ؛ همانطور که آقای محسن خان فرمودند ، فعلا بنده سعی دارم بخش‌های مختلف که مد نظر هست را تحلیل کنم و این مدل‌های به دست آماده ، در آینده هم مانع پیاده سازی این سیستم به صورت ماژولار نخواهند شد.
با نظر شما کاملا موافقم ؛ پیشتر از اینها چندین بار تصمیم گرفتم تا سیستمی با قابلیت توسعه بالا توسعه داده شود ، ولی یکسری چالش هایی برای خودم داشت که میتونه در مقالات آینده و بعد از اتمام DomainClass‌ها مورد بحث قرار بگیرد. 
نظرات مطالب
دسته بندی چابکانه
سلام. درست است. در حقیقت کاری را زمانبندی می‌کنیم که در آینده نزدیک باید انجام شود. به طور مثال بخشی از یک پروژه که باید تا تاریخ خاصی به اتمام برسد را در نظر بگیرید. اگر اکنون زمان مناسبی برای انجام این پروژه نیست بهتر است برای انجام آن زمان مشخصی را در تقویم خود ثبت کنید. حال فرض کنید شما می‌خواهید راجع به ایده جدیدی با همکار خود بحث و گفتگو کنید اگر اکنون زمان مناسبی برای انجام آن نباشد بهتر است آن را به آینده موکول کنید. ناگفته پیداست این تصمیمات کاملا شخصی است و وابسته به شرایط هر فرد است. 
نظرات اشتراک‌ها
درس خوندن، ارزشش رو داره؟
به نظر من شاید دانشگاه خصوصا در ایران چیزی که به درد بازار کار بخوره رو یاد نمیده ولی اصولی که در دانشگاه یاد می‌گیرید حتما در آینده در یادگیری تکنولوژی‌های جدید کمک می‌کنه.
نظرات مطالب
پیاده سازی پروژه نقاشی (Paint) به صورت شی گرا 3#
درسته اما در قسمت اینترفیس کاربر باید Brush‌های مورد نظر ساخته شده و به این متد پاس داده شود، در مراحل پایانی فکر می‌کنم بهتر منظورم بتونم برسونم، به دلایلی (که در پست‌های آینده گفته میشه) از این روش‌ها استفاده نکردم.
نظرات مطالب
معرفی یک ابزار گزارشگیری رایگان مخصوص WPF
سلام
خسته نباشید
من احساس می کنم بهتر باشه از همان ابزارهای تجاری استفاده کرد.چون اگه در آینده نیاز باشه برنامه و گزارش مربوطه پیشرفته تر بشته و یا توسعه داده بشه بهتر میشه این کار رو انجام داد.
نظرات نظرسنجی‌ها
آیا قصد مهاجرت به NET Core. را دارید؟
برای پروژه‌های آینده قطعا این کار باید انجام شود، ولی در حال حاظر .net core خیلی جوان است و بسیاری امکانات و همچنین ابزارهای جانبی آن برای پروژه‌های بزرگ و سازمانی آماده نیست. آشنایی و تست امکانات آن راهگشاست ولی حداقل از ابتدای سال 2017 باید به استفاده از آن فکر کرد.
نظرسنجی‌ها
با توجه به امکانات جدید Razor Components، آیا در آینده از SPA frameworks استفاده میکنید؟
بله همچنان به یادگیری و استفاده از SPA frameworks ادامه می‌دهم
خیر نیازی به استفاده از SPA frameworks در آینده نمی‌بینم
Razor Components به نظر امکان خوبی نیست و نمی‌تواند جایگزین مناسبی برای SPA frameworks باشد
نظرات مطالب
lambda expression در Vb.net
چه اصراری است از زبانی استفاده کنیم که مدرسان ، حرفه ای‌ها ، اپن سورس نویس ها، طراحان الگو و .... از اون استفاده نمی‌کنند. نمی‌خوام وارد بحث مسخره vb.net  بهتر است یا C# بشم فقط اینقدر بدونید بخاطر انتخاب اشتباه زبان که خودم در شروع اون نقشی نداشتم دو سه سال از عمرم پای  vb.net حروم شد و دوست ندارم علاقمند واقعی برنامه نویسی این اشتباه رو انجام بدن.
اگه به بحث‌های ساختاری این دو زبان کاری نداشته باشیم اینکه فضای کار و آموزش از vb.net  استفاده نمی‌کنه بهترین دلیل برای دوری جست از این زبان برنامه نویسه.
کاشکی یک بند دیگه هم به وضعیت فناوری‌های مرتبط با دات نت از دیدگاه مرگ و زندگی! اضافه می‌شد و تازه کارها رو از vb.net  نهی می‌کرد.
ببخشید که این نظر به محتوای فنی پست ارتباطی نداره.