کاربرد انتگرال های فازی در دسته بندی طبقه بندی کننده ها

بیاید یه پروژه خیلی بیمزه براتون تعریف کنم. آقا این ترم ما یه درس داغون داشتیم به اسم «ترکیب اطلاعات» که حتی کتاب هم نداشت. استادمون هم ادعاش میشه گفت این خیلی مبحث جدیده و این صحبتا و کلا از روی مقاله درس میداد. قضیه اش هم اینه که چه طور منابع مختلف رو با هم ترکیب کنیم. حالا این منابع هر چی میتونه باشه. مثلا سنسورهای یه ماشین، دوربینای مداربسته یا حتی نظرات افراد مختلف راجع به یه چیز خاص. ینی میخواد چند تا تصمیم راجع به یه چیزی رو ترکیب کنه و به بهترین تصمیم و نتیجه گیری برسه. خب این نحوه ترکیب، نحوه تصمیم گیری و یه عالمه المان دیگه خودش کلی بحث میشه راجع بهش کرد. ولی خب کلا بیمزه است. خیلی زیاد آکادمیکه و اصلا کاربرد رایج و روزمره و پروژه های معمولی نداره. ینی حتی کوچکترین و کلی ترین اصطلاحی رو هم سرچ میزدی برات مقاله میاورد. ینی بدبختا وقت و حوصله نکرده بودن یه صفحه ویکی پدیا بسازن. آخه چه کاریه؟ عححالا دیگه ما کج دار و مریض کلاسا رو رفتیم و تمرینا رو دادیم و پروژه اش رو هم حتی زدیم. بعد هیشکی از بچه ها هم حوصله اش رو نداشت. ینی توی کلاس 11 نفره فقط من و یه نفر دیگه بودیم که واسه این پروژه وقت گذاشتیم. حالا من اینجا مینویسم چیه قضیه اش و اینا. شاید به درد یکی خورد. کلا قضیه «ترکیب اطلاعات» یا data fusion اینه که چه طوری یه سری چیز رو با هم ترکیب کنیم :)) البته این مبحث جدیدی نیست و توی ماشین لرنینگ ترکیب یه بحث جدیه ولی خب تحت عناوین دیگه و با نگاه های دیگه . مثلا یه بحث داریم به اسم ensemble learning. اینکه چه طوری بیایم الگوریتم های مختلف ماشین لرنینگ رو ترکیب کنیم که به عملکرد بهتری برسیم. یا مثلا Feature fusion. اینکه ویژگی های لایه های مختلف رو چه طوری با هم ترکیب کنیم. اینجا هم مسئله ترکیب مطرحه ولی با یه نگاه دیگه. توجه به منابع اطلاعاتیروشهای ترکیب هم خیلی مختلفن. انواع و اقسام روش های میانگین گیری وزن دار و سیگما و روش های مرتب سازی و ضریب دهی و این حرفا. حالا منطق فازی هم توی روش ها مطرحه. منطق فازی ینی اینکه همه چی رو دقیق نبینیم. ینی چی؟ مثلا توی منطق دودویی یا حساب مجموعه ها، یه عضو یا به یه مجموعه ای تعلق داره یا نداره. مثلا یه عدد یا زوجه یا فرد. غیر از این حالت نداریم. البته صفر هست ولی خب یه جوری ماست مالیش میکنن. یا مجموعه مضرب های یه عدد. همه چی خیلی دقیقه. ولی یه سری مفهوم هم داریم که حدودی ان. مثل چی؟ مثال معروفش تب داشتنه. دما طبیعی بدن انسان 37 درجه است. حالا اگه یکی 38 درجه بود تب داره، یکی که 40 درجه هم بود بازم بهش میگن تب داره. ولی اولی تبش خیلی شدید نیست. دوم دیگه داره میمیره. بنابراین هر دوشون به مجموعه تب دارها تعلق دارن ولی درجه تعلقشون انگار یه کم فرق داره. حالا توی این منطق ما میتونیم محاسبات کنیم. یکی از عملهایی که توی این منطق تعریف میشه انتگرال تعریف کرد. همونطور که میدونین انتگرال بسط تعریف سیگماس. یعنی جمع یه مجموعه اعداد پیوسته. دو تا انتگرال معروف داریم که عملیات ترکیب رو شبیه سازی میکنن. 1. انتگرال choquet و 2.انتگرال sugeno.پروژه ای که من زدم این بود که یه دیتاست معروفی داریم به اسم webspam-uk2007 . اومدن یه عالمه سایت رو دادن به یه سری آدم و گفتن نظرتون رو راجع به اسپم بودن یا نبودن این سایتا بگین. حالا از روی اسم دامین. چون بعضیاش واقعا ضایعه یا اینکه مثلا از محتوای سایت و اینا. همه هم راجع به همه سایتا نظر ندادن و این یه نکته ای بود که یه کم کار برد تا بشه هندلش کرد. خب پروژه ما این بود که بیایم نظراتی که راجع به هر سایت داده شده بود رو ترکیب کنیم با این انتگرالا و بعد بیایم با لیبل نهایی که از روی میانگین به هر سایت داده شده بود مقایسه کنیم. برای محاسبه انتگرالها هم خیلی کد آماده پیدا نمیشه.چون یه موضوع خیلی آکادمیکه. و از اونجایی که واقعا لازم نیست ادم خودش بشینه این چیزای معروف رو پیاده سازی کنه. من یه پکیج نسبتا کامل به زبان پایتون پیدا کردم به اسم fancy-aggrigation. که خیلی از متدهای ترکیبی رو پیاده سازی کرده بود و با اون کار کردم. نکته ای از این پروژه که زمان گرفت مچ کردن دیتاست و الگوریتم ترکیب بااستفاده از انتگرال choquet بود. اول از همه که باید کتابخونه های numpy و pandas و یه سری کتابخونه دیگه رو import کنیم :اون re چیز مهمی نیست و integral هم فایلی هست که انتگرالها توش پیاده سازی شده. مرحله بعد پیش پردازش دیتاست. اول اینکه بیایم لیبل ها رو تبدیل به عدد کنیم که بتونیم بدیمشون به انتگرال. چون مثلا فرمت دیتا ست اینجوریه :ینی ارزیاب 1 و ارزیاب 2 به سایت شماره 5 برچسب non spam دادن. بخاطر همین اومده میانگین گرفته و در نتیجه این سایت غیر اسپم تشخیص داده شده. به هر لیبل یه عدد اختصاص دادیم. اسپم بودن 1، اسپم نبودن 0 ، حالت مرزی بین این دو تا 0.5 و اینکه طرف ندونه یا unknown رو 1- در نظر میگیریم. گفتم که دیتاست یه مشکلی که داشت این بود تعداد ثابتی به هر سایت رای نداده بودن. مثلا به یه سایت 2 نفر رای دادن. به یکی 5 نفر. من اومدم اول این تعداد رو ثابت کردم. یعنی بیشتری رایی که به هر سایت داده شده بود رو در نظر گفتم و به تعداد اون به بقیه اضافه کردم. حالا این اضافه کردن چه عددی باشه بماند. این دو تا نکته پیش پردازش رو اینجوری پیاده سازی کردم :البته راه حل های بهتری هم هست برای ثابت کردن تعداد رای دهنده ها. مثلا همه رو یه تعداد ثابتی بگیریم و بیشترین ها حذف کنیم به عنوان outlier درنهایت هم دو تا تابع از همون پکیج رو کال میکنیم و درصد خطای نتایج رو با لیبلهای توی فایل محاسبه میکنیم :حالا چون اینا عکسه ، کدش رو هم میذارم. و اینکه یه لینک یوتیوب هم میذارم که الگوریتم ترکیب با استفاده از الگوریتم choquet رو خیلی خوب توضیح میده و من خودم از اون یاد گرفتم و هر چی بگم، تکرار حرفای اونهاین کدها و اینم لینک یوتیوب:)