مفهوم ویژگی ، بردار ویژگی و استخراج ویژگی چیست؟
سلام.. ما در درس شناسایی آماری الگو، و درس یادگیری ماشین با اصطلاح ویژگی خیلی روبرو میشویم که یک بحث مهمی است. برای اینکه بتوانیم یک مدل خوب طراحی کنیم لازمه که ویژگی خوبی استخراج کنیم، در این جلسه قصد داریم در مورد ویژگی صحبت کنیم و به سوالاتی از قبیل: ویژگی و استخراج ویژگی چیست؟ چرا باید ویژگی استخراج کنیم؟ و مشخصات ویژگی خوب چیست؟ پاسخ بدهیم.
در شناسایی آماری الگو، ویژگی به یک مشخصه یا خصوصیت قابل اندازهگیری از یک پدیدهای که مشاهده میکنیم گفته میشود. از هر پدیده ویژگیهای مختلفی را اندازهگیری می کنیم که به آن پروسه استخراج ویژگی گفته میشود. سپس ویژگی های استخراج شده را کنار هم قرار میدهیم که به آن بردار ویژگی گفته میشود.
فرض کنید در مثال بالا از هر ماهی عرض و شدت روشنایی ماهی را به عنوان ویژگی در نظر بگیریم، این دو تا ویژگی را از تصویر ثبت شده ماهی اندازه گیری می کنیم و کنار هم قرار میدهیم که در واقع به آن بردار ویژگی می گوییم. سوال اینجاست که چرا باید ویژگی استخراج کنیم؟ آیا نمیتوان داده را مستقیما به مدل ارائه کرد؟ داده ای که تمام اطلاعات داخل آن هست!
بیان مثال برای استخراج ویژگی
اجازه بدهید با یک مثال این مسئله را توضیح بدهم. فرض کنید شما میخواهید یک ماشینی طراحی کنید که کارش تشخیص چهره باشد!
اگر خیلی ساده به مسئله نگاه کنیم در حالت ایده آل ما به چنین سیستمی نیاز داریم:
خب برای اینکه مدل یاد بگیرد ما نیاز به داده داریم، از چهره های مختلفی که قراره سیستم ما چهره آن را تشیخص دهد داده جمعآوری می کنیم.
حال نوبت این رسیده است که داده ها را به مدل ارائه دهیم تا مدل یاد بگیرد. اگر بخواهیم از شدت روشنایی هر پیکسل تصویر به عنوان ویژگی استفاده کنیم و خود تصویر به عنوان ورودی به مدل ارائه دهیم، یعنی اطلاعات خود تصویر را مستقیما به مدل ارائه دهیم، لازم است که در ابتدا تصویر را به یک بردار تبدیل کنیم تا بردار ویژگی آن تصویر ساخته شود و بعد به مدل ارائه دهیم. توجه داشته باشیم که مدل یادگیری ماشین ورودی بردار میگیرد نه ماتریس!
فرض کنید تصویر ورودی شما یک ماتریس 4*4 است، در این صورت به صورت زیر به یک بردار 1*16 تبدیل میشود.
خب اگر تصویر ما یک ماتریس 50*50 باشد در آن صورت بردار ویژگی ما یک بردار 2500*1 خواهد شد! یک عدد بسیار بزرگ! حال اگر اندازه تصویر بزرگتر شود که این اندازه خیلی بزرگتر هم خواهد شد!
خب ایراد ارائه مستقیم داده خام به مدل در چیست ؟
- افزایش پیچیدگی محاسباتی: هرچقدر تعداد ویژگی زیاد شود، هزینه محاسباتی افزایش می یابد و همچنین مدل مجبور است رابطه بین خروجی و یک ورودی که ابعاد بسیار بالایی دارد را پیدا کند، که کار بسیار سختی است و رابطه مناسبی پیدا نخواهد کرد. اگر فرض بر این باشد که تمام ویژگی ها خوب هستند و ما توانایی افزایش تعداد نمونه ها را داریم شاید بتوان با افزایش تعداد نمونه ها تا حدودی رابطه دقیق تری بین ورودی و خروجی پیدا کرد. ولی در عمل ما تعداد نمونه ی کمی داریم و محدودیت داده داریم!
- وابستگی ویژگی ها به تغییرات: اطلاعات داده خام وابسته به تغییرات است! یعنی در واقع ویژگی های استخراج شده که در اینجا اطلاعات هر پیکسل تصویر است به پارامترهای زیادی وابسته است و با تغییر کوچک این پارامترها مقادیر پیکسلها تغییر می کنند و در نتیجه مدل ما درست کار نخواهد کرد! برای مثال اگر شخص ریش داشته باشد! دیگر پیکسلها مقادیر قبیلی را نخواهند داشت! تغییراتی همچون جابجایی، چرخش، نویز، اندازه و غیره تاثیر مستقیمی بر مقادیر پیکسل ها دارند و در نتیجه مدل ما هیچ وقت درست کار نخواهد کرد.
راهکار
به جای اینکه از خود تصویر استفاده کنیم، یا به عبارت دیگر به جای اینکه داده ورودی را مستقیما وارد سیستم کنیم، از ویژگی های آن استفاده کنیم. یعنی یک سری ویژگی که نماینده خوبی برای داده ورودی باشند و در عین حال وابسته به تغییرات نباشند را استخراج کنیم و به عنوان ورودی به مدل ارائه دهیم. در این صورت چنین سیستمی خواهیم داشت.
برای مثال در تصویر زیر فاصله های بین نقاط کلیدی تصویر را به عنوان ویژگی در نظر بگیریم.
در این صورت هم مشکل پیچیدگی محاسباتی حل می شود و هم ویژگی هایی استخراج می کنیم که وابسته به تغییرات نباشند که این وابسته به شما خواهد بود که چه روشی را برای استخراج ویژگی استفاده کنید.
چه ویژگی هایی استخراج کنیم؟ مشخصات ویژگی خوب چیست؟
ویژگی خوب باید سه شرط زیر را داشته باشد:
- Informative باشد. یعنی رابطه مستقیمی با خروجی داشته باشد، مثلا در تشخیص چهره دمای اتاق یا رنگ پیراهن هیچ ربطی به خروجی ندارند و نباید استخراج شوند.
- Discriminant باشد. ویژگی باید مقادیر متفاوتی بین کلاس ها داشته باشد. در حالت کلی ویژگی خوب ویژگی ای است که واریانس درون کلاسی آن حداقل(یعنی بین نمونه های مشابه مقدار یکسان و یا نزدیکی بهم داشته باشند) و واریانس بین کلاسی آن حداکثر(بین نمونه های سایر کلاسهاد مقدار متفاوتی داشته باشند) داشته باشند.
- ویژگی ها از هم مستقل باشند. ویژگی ها اگر مستقل نباشند درواقع بحث افزونگی یا همان redundacy پیش می آید که باعث کاهش عملکرد سیستم می شود. ما ممکن است ویژگی های خوبی استخراج کنیم، ولی این ویژگی ها کنار هم اصلا نمیتوانند خوب عمل کنند و در نتیجه کارایی مدل کاهش می یابد.
چطور ویژگی خوب استخراج کنیم؟
استخراج ویژگی یکی از مهمترین مراحل یادگیری ماشین است و اگر ما ویژگی خوبی استخراج نکنیم، الگوریتم تصمیم گیرنده ما هرچقدر هم که خوب باشد نمی تواند عملکرد خوبی داشته باشد! پس باید حوسمان باشد که ویژگی های خوبی به مدل تصمیم گیرنده ارائه بدهیم. ولی خب سوال اینجاست که من چگونه ویژگی خوب استخراج کنم؟؟ جواب: گوناگون(مزاح بود)
ما خودمان به سختی میتوانیم یک ویژگی خوب را تشخیص دهیم. در یادگیری ماشین، الگوریتمهایی داریم که کارشان تشخیص ویژگی خوب هست، پس تا جایی که میتوانید شما ویژگی استخراج کنید و کاری به خوب یا بد بودن آن نداشته باشید، در واقع کورکورانه هر ویژگی ای که میتوانید استخراج کنید بعدا این الگوریتمهای انتخاب ویژگی، ویژگی های خوب را انتخاب کرده و به کلاسبند ارائه میدهند. در یادگیری ماشین برای تشخیص چهره و یا هر تسک شناسایی چه سیگنال و چه تصویر از مدل زیر استفاده میکنند که در جلسه بعدی مفصل در مورد این بخش توضیح خواهم داد.
پس در مرحله استخراج ویژگی، ویژگی ای که استخراج شده لزوما ویژگی خوبی نیست و باید در مرحله انتخاب ویژگی، ویژگیهای خوب حفظ و ویژگی های بد حذف شوند!
مشخصات ویژگی خوب را هم در بالا توضیح دادیم. برای درک ساده مطلب شما را به مشاهده ویدیو دعوت میکنم.
باسلام، ممنونم از توضیحات خوبتان، بسیار جامع و کاربردی بود، من چند تا سوال برایم پیش آمده که اگر توضیح دهید ممنون میشم.
۱. شما یک جایی گفتید تا میتوانید ویژگی از تصایر استخراج کنید، من متوجه نشدم که مثلا در نرم افزار متلب من خودم چه طور ویژگی استخراج کنم و به سیستم بدهم؟
۲.یک مسئه دیگری که میخواستم لطفا راهنمایی کنید من را این است که من باید با استفاده روش الگوی دودویی محلی و تهیه هیستوگرام از الگوی دودویی به استخراج ویژگیهای تصویر بپردازم و باید از متغیرcount بر شدت پیکسل هاست استفاده کنم یا
سلام
وقت بخیر
در هر موضوعی ویژگی های مختلفی هست که برای هر ویژگی یک رابطه ای وجود دارد که شما اون رابطه را پیاده سازی میکنید و سپس مقدار ویژگی مورد نظر در سیگنال و یا تصویر را محاسبه می کنید. یا به اصطلاح ویژگی استخراج میکنید. برای
در تصویر میتونید از تابع imhist استفاده کنید.
با حلقه for و ایجاد یک کانتر هم میتونید توزیع آماری تصویر رو حساب کنید.
سلام
مرسی از اطلاعاتتون
من یک دیتاست دارم با 9 ویژگی عددی، می خواهم با استفاده از این 9 ویژگی تعداد ویژگی ها رو افزایش بدهم تا دقت دسته بندم افزایش یاید.
چه روشی پیشنهاد می دهید؟
ویژگی هارو که نمیشه از روی همان قبلی ها اضافه کرد. با اینکار عملا اطلاعات جدیدی وارد سیستم نمیشود
باید ویژگی های جدید استخراج بشه و اینکه چه ویژگی هایی استخراج شود هم کاملا بستگی به نوع سیگنال یا تصویر شما دارد. بهترین کار مطالعه مقالات معتبر مرتبط هست