چگونه آمار را به خاک و خون بکشیم؟ :: راسپینا

راسپینا

فصل طلایی

چگونه آمار را به خاک و خون بکشیم؟

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


همین‌جوری که به این تصویر نگاه کنید، می‌بینید که این نقطه‌ها احتمالا تو دو تا دسته قرار می‌گیرن. اما خب، ما اصولا وقتی با داده‌ها سر و کار داریم، باید فرض «چشم داشتن» و «نگاه کردن» رو بذاریم کنار و با روابط ریاضی به نتیجه برسیم.
حالا چی کار کنیم؟ فعلا بیاید فرض کنیم از غیب به ما الهام شده که تعداد این دسته‌ها دو تاست.(چون همون طور که گفتم، چشم نداریم و نمی‌دونیم دسته‌ها چند تاست!)
یه معیار خوب برای این که دسته‌بندی رو انجام بدیم، یعنی بگیم هر نقطه به گدوم دسته تعلق داره، اینه که مرکز هر دسته رو در نظر بگیریم، بعد فاصله‌ی هر نقطه رو با مرکز هر دسته به دست بیاریم، بعد با هر مرکزی که فاصله‌ش کمتر بود، بگیم نقطه‌مون به اون دسته تعلق داره. اما ما الان نمی‌دونیم مرکز دسته‌هامون کجاست! به شکل عجیبی این یکی از غیب بهمون الهام نشده:))
پس بریم سراغ الگوریتم‌مون!
اساس این الگوریتم اینه که فرض کنیم یه چیزایی رو داریم، بعد برای باقی چیزاها تصمیم بگیریم. بعد برگردیم ببینیم تصمیم‌هایی که گرفتیم، می‌تونه فرض اولیه‌مون رو بهبود بده یا نه و اگه بهبود می‌داد، فرض اولیه رو عوض کنیم و دوباره تصمیم بگیریم و اون قدر این کار رو (یعنی فرض کردن و تصمیم گرفتن رو) تکرار کنیم که دیگه به یه فرض و تصمیم ثابتی برسیم. الان مثال رو که توضیح بدم، متوجه میشید:))
توی این مثال، ما همون‌طور که گفتم، مرکز دسته‌ها رو نداریم. پس همین جری الکی یه فرضی راجع به مرکز دسته‌ها می‌کنیم و میریم جلو تا بعدش ببینیم چی میشه!
بیاید دو تا نقطه‌ی کاملا تصادفی A و B رو در نظر بگیریم و فرض کنیم مراکز این دو تا دسته هستن. این میشه فرض اولیه‌مون و با احتمال ۱۰۰ درصد اصلا فرض خوبی نیست؛ دو تا نقطه رو از صفحه انتخاب کردیم و اسم‌شون رو گذاشتیم مرکز، در حالی که ممکنه اصلا یه جاهای پرتی باشن! مثل این عکس:


حالا می‌خوایم بر مبنای این فرض اولیه، تصمیم بگیریم که هر کدوم از نقاطی که داشتیم تو کدوم دسته هستن. دسته‌ی a یا دسته‌ی b . پس میایم فاصله‌ی تک‌تک نقاط رو از این دو تا نقطه‌ی A و B حساب می‌کنیم و بر اساس این فاصله، هر کدوم رو به یه دسته‌ای نسبت میدیم. خب! ما اینجا با کمال اعتماد به نفس یه دسته‌بندی غلط رو انجام دادیم!


حالا که تصمیم‌مون رو گرفتیم و یه بار دسته‌بندی رو انجام دادیم، بیاید برگردیم سراغ تعریف مرکز. وقتی میگیم A مرکز دسته‌ی a هست، منظورمون چیه؟ منظورمون اینه که A یه جورایی میانگین همه‌ی نقاطی هست که تو دسته‌‌ی a قرار دارن. حالا ما چی داریم؟ توی هر دسته،یه سری نقطه و یه مرکز به اسم A که فقط اسمش مرکزه و ممکنه حتی اون سر دنیا باشه! پس وقتشه که فرض‌ اولیه‌مون (یعنی مرکز بودن A) رو اصلاح کنیم!
برای اصلاحش چی کار کنیم خوبه؟ کافیه مرکز قبلی رو بذاریم کنار و حالا که دسته‌ی a رو به دست آوردیم، از نقاطی که تو دسته‌ی A داریم، میانگین بگیریم تا حالا که دسته‌هامون به وضوح غلط هستن، حداقل مرکزاشون درست باشن! این‌جوری:


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

 حالا یه فرض جدید یا به عبارتی، «به روز شده»  داریم.و بر اساس این فرض باید دوباره تصمیم بگیریم. در واقع دو تا مرکز جدید داریم و حالا باید دسته‌ی b وa ای که تو دور قبلی به دست آورده‌بودیم رو بذاریم کنار و یه دور دیگه نقاط‌مون رو دسته‌بندی کنیم. یعنی برگشتیم سر خونه‌ی اول! یه سری نقطه داریم، با دو تا نقطه‌ای که حدس می‌زنیم مرکز باشن. این‌جوری:


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


بعد از این مرحله دوباره یه دسته‌بندی جدید داریم! حالا باز باید بریم مرکز این دسته‌های جدید رو پیدا کنیم.


دیدید چی شد؟ با همین چند تا مرحله رسیدیم به اون چیزی که می‌خواستیم! با یه دونه حدس غلط شروع کردیم و حالا رسیدیم به جای درست! هم دسته‌بندی‌مون درست انجام شده، هم مرکز هر دسته به دست اومده!

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

***

این یکی از ساده‌ترین مثال‌های الگوریتم EM بود که به راحتی و با کشیدن چند تا نقطه رو کاغذ و استفاده از خط‌کش می‌تونید امتحانش کنید! اما خب خیلی جاهای دیگه هم مورد استفاده قرار می‌گیره و ابزار قوی‌ای محسوب میشه و بعضی مسائل به شدت پیچیده که روش مستقیمی برای حل کردن‌شون نیست رو میشه با همین الگوریتم حل کرد.
یا مثلا تو همین مسئله تعریف دسته‌ها می‌تونه عوض بشه (مثلا یه توزیع آماری باشه) یا فاصله یه معنی دیگه داشته‌باشه که خب اینجا گفتنش ضرورتی نداره.
اگه واقعا چند تا دسته توی نقاط‌تون داشته‌باشید و تعداد دسته‌ها رو درست در نظر گرفته‌باشید، بالاخره بعد از چند بار اجرای الگوریتم، دسته‌ها و مرکز‌هاشون رو پیدا می‌کنید.
اما اگه دسته‌بندی‌ای وجود نداشته‌باشه چی؟ مثلا فرض کنید نقطه‌ای وجود داره که فاصله‌ش از مراکزی که تعیین کردیم به یه اندازه باشه و هر بار که الگوریتم رو اجرا می‌کنیم، شانسی توی یه دسته قرار بگیره. این نقطه نمی‌ذاره الگوریتم ما هیچ وقت متوقف بشه. چون هر بار میره توی یه دسته و باعث میشه مرکزی که انتخاب کردیم تو مرحله‌ی بعد جابه‌جا بشه.
برای حل این مشکل میشه که بررسی کنیم و اگه دیدیم فقط یکی دو تا از این نقطه‌ها داریم، اونا رو نادیده بگیریم و در واقع فرض کنیم با خطای اندازه‌گیری ایجاد شدن. اما اگه تعداد اینا خیلی زیاد بود، به این معنیه که امکان دسته‌بندی وجود نداره یا تعداد مرکز‌ها رو درست انتخاب نکردیم. یعنی مثلا ما سه تا دسته داشتیم در اصل، ولی فرض کردیم دو تا دسته داریم، حالا نقاط دسته‌ی سوم آواره شدن و هر بار خودشون رو می‌چسبونن به یه دسته و نمیذارن ما هم به دسته‌بندی‌مون برسیم!
راه حل چیه؟
یادتونه گفتم فرض کنیم از غیب بهمون الهام شده که ۲ تا دسته داریم؟ واقعیت اینه که هیچ وقت از غیب بهمون الهام نمیشه که چند تا دسته‌داریم:)) معمولا از روی داده‌ها میشه یه حدسایی زد. مثلا اگه این نقطه‌ها یه سری آدم سالم یا بیمار باشن که با مدل‌سازی ما تبدیل به این نمودار شده‌باشن، به وضوح دو تا دسته داریم: سالم و بیمار!
اما اگه داده‌هامون هیچ اطلاعاتی به ما ندن چی؟
باز هم راه‌هایی هست. راه‌های ساده و پیچیده! ساده‌ترین راه می‌دونید چیه؟ این که چندین بار الگوریتم رو اجرا کنیم. یعنی اول فرض کنیم دو تا دسته داریم، بعد فرض کنیم ۳ تا دسته داریم، بعد فرض کنیم ۴ تا دسته داریم و اون قدر ادامه بدیم تا به یه نتیجه‌ی خوب برسیم که این «نتیجه‌ی خوب»، خودش تعریف داره و قابل سنجیدن هست. مثلا اگه ما هی تعداد دسته‌ها رو زیاد کنیم، ممکنه به یه جایی برسیم که بگیم به تعداد نقاط‌مون دسته داریم و هر نقطه خودش مرکز یه دسته‌س! به نظر ممکنه درست بیاد، ولی به چه دردی می‌خوره خب؟
***
خب! امیدوارم تونسته باشم خوب توضیح بدم. اگه کنجکاوتر بودین، می‌تونید سوال هم بپرسید:))

+ آقاااا... من این پست رو ۲۷ تیر نوشته‌بودم! یعنی ببینید تنبلی چه می‌کنه با آدم:))
+ و البته یه نیم ساعتی هم با صندوق بیان درگیر بودم الان و آخرم عکسا رو یه جا دیگه آپلود کردم.
فاطمه ‌‌‌‌
۱۵ مهر ۱۲:۲۶

به‌به، به‌به :)

خب اول از همه، EM چیه؟ :دی

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

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

البته الان که نوشتم متوجه شدم خود داده‌ها الزاما نمی‌تونن مرکز دسته باشن :/ پس مثلا بار اول این کارو کنیم، دفعه‌های بعد همون میانگین دسته‌هایی که بهشون رسیدیم رو بگیریم.

پاسخ :

:))
EM میشه مخفف expectation maximization. میای یه حدسی می‌زنی، بعد یواش‌یواش حدست رو تغییر میدی و به سمتی حرکت می‌کنی که احتمال مشاهداتت به شرط اون حدس، ماکزیمم بشه.
در واقع KNN رو میگن، بعد میان این روش رو میگن. این الگوریتم EM هم لزوما کاربردش دسته‌بندی نیست. ولی تو دسته‌بندی خیلی راحت‌تر میشه توضیحش داد. کاربردهای دیگه هم داره. اینجا اومدیم تو دسته‌بندی ازش استفاده کردیم. مثلا من دیروز یه ارائه داشتم، یه مقاله‌ای بود که برای پیدا کردن فرکانس هم از این الگوریتم استفاده شده‌بود.
آره، من مثالم رو خیلی ساده انتخاب کردم و دقیقا مشکل این الگوریتم اینه که کنده. خیلی جاها به جواب می‌رسه، اما راه‌های سریع‌تری هم ممکنه باشه. خیلی جاها هم اون قدر راه‌های دیگه پیچیده‌س که فقط میشه با همین الگوریتم به نتیجه رسید و در اون صورت خب به صرفه‌س.
انتخاب مرکز از بین داده‌ها هم فکر می‌کنم حداقل باعث بشه یه کم سریع‌تر به نتیجه برسیم و تعداد گام‌هامون کمتر باشه. هر قدر نقطه‌ی شروع‌مون به جواب نزدیک‌تر باشه، طبیعتا بهتره. ولی خب دقیقا همون‌طور که گفتی، فقط اولش انتخاب با ماست. بعدش دیگه باید طبق تعریف‌ها پیش بریم.
استیص‍ ‍آل
۱۵ مهر ۱۲:۳۶

من الان به این نتیجه رسیدم که اگه در مورد بهترین شیوه حرکت توی یه مسیری شک داشتم (اگه قابل باز گشت و تکرار باشه البته) میتونم بهترین کار رو با تکرار یه فرض اولیه ای که هیچی ازش نمیدونم و بررسی نتیجه و باز تکرارش پیدا کنم. فقط مشکلی که هست اینه که سرعت پردازش کامپیوتر خیلی کم و برای ما میتونه به قیمت تموم شدن عمرمون باشه :)

پاسخ :

دقیقا!
 می‌خواستم ته پستم این شعر رو اضافه کنم که: «به راه بادیه رفتن، به از نشستن باطل!» و از این نتیجه‌ها هم بگیرم:))
چون پست طولانی شد، ننوشتم:))
فاطمه ‌‌‌‌
۱۵ مهر ۱۳:۲۰

آهان پس اون کاربردش خیلی بیشتر از دسته‌بندی و اینهاس.

مرسی :)

پاسخ :

آره، خیلی کاربردیه.
خواهش می‌کنم:)
محمدعلی ‌‌
۱۵ مهر ۱۴:۳۴

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

 

پاسخ :

«اصل ناخونک»! چه باحال!
خواهش می‌کنم:)
من خودم چون کارشناسی سخت‌افزار بودم، خیلی با الگوریتم‌های مختلف آشنایی نداشتم. برای کنکور ارشد که تصمیم گرفتم کنکور هوش بدم، رفتم یه کتاب خریدم که درس هوش مصنوعی رو بخونم، و واقعا با الگوریتم‌هاش به وجد میومدم! هوش مصنوعی برام شده‌بود جایزه. مثلا با خودم قرار میذاشتم اگه فلان‌ قدر سیگنال و فلان‌ قدر شبکه خوندم، حق دارم برم هوش مصنوعی بخونم! بس که الگوریتم‌هاش شیرین بودن به نظرم.
مهدی ­­­­
۱۵ مهر ۱۷:۵۸

خیلی پست جالبی بود! مرسی!

پاسخ :

ممنون:)
خواهش می‌کنم!
کَپُو ...
۱۶ مهر ۰۰:۳۰

سلام

چقد خوب توضیح دادید. من هر چی فک می‌کنم که چی می‌تونم یاد بدم گیج می‌شم، از بس "ناخونک‌وار" خوندم. هااااای زندگی.

خیلی جالب بود، یه چیزی هم تازه خوندم «مونت کارلو» اونم خیلی شعف‌انگیز بود.

 

من دی‌اف‌اس بی‌اف‌اس یادمه، اگه با اونا حل کنم نمره قبولی می‌گیرم استاد؟

پاسخ :

سلام
خیلی ممنون:)
منم رو اکثر موضوعا هنگ می‌کنم، حالا بعضیاش رو یه کم بلدم:))
بلی، بلی، مونت کارلو هم خیلی چیز باحالیه!

با dfs و bfs چطور می‌خواید دسته‌بندی انجام بدین؟!🤦🏻‍♀️😂
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
Designed By Erfan Powered by Bayan