نقل قول:
نوشته اصلي بوسيله AlirezaJJ
سلام
برای یک تمرین احتیاج دارم که بردار ویژه های یک ماتریس با ابعاد 17000 در 17000 را بدست بیارم. اما متلب قادر به محاسبه برای ماتریسی با این ابعاد نیست و خطا در حافظه میده. یک روش تو ویکی پدیا پیدا کردم که کامل توضیح داده نشده. کسی می تونه تو این زمینه کمکم کنه؟!؟!
در ضمن این ماتریس اسپارسه ...
پیشاپیش ممنون و سپاسگذارم ...
|
من خودم برای شناسایی چهره به این مورد برخوردم. اونجا مثلا k تا تصویر داریم که ابعادش مثلا [n,m] هست که به صورت ستونی تبدیلش می کنیم میشه [n*m,1]. بعد این بردارهای ستونی که تعدادش k تا هستند کنار هم می گذاریم میشه [n*m,k] . بعد لازم میشه که ماتریس کواریانسش رو به دست بیاریم حالا اینجا اگه A' *A بکنیم با 'A*A با هم فرق می کنه.
بعدش هم در نهایت می خواهیم از این ماتریس کواریانس بردار ویژه و مقادیر ویژه شو به دست بیاریم. ماتریس کواریانس ما در اصل دارای ابعاد n*m,n*m خواهد بود که دارای اندازه بزرگی خواهد بود یعنی به تعداد پیکسلها . بنابراین کاری که میشه کرد اینه که بجای محاسبه 'A*A که ابعادش میشد n*m,n*m می تونیم A' *A را محاسبه کنیم که ابعادش میشه k*k که به دلیل اینکه مقدار k خیلی کمتر از تعداد پیکسلهاست مشکلمان حل میشه و به راحتی می تونیم مقادیر و بردارهای ویژه رو محاسبه کنیم برای این ماتریس k*k .
k مثلا 50 هستش .
حال باید برداهای ویژه به دست آمده( با ابعاد k*1 به تعداد k) رو یه جوری به بردارهای ویژه اولیه با ابعاد n*m,1 به تعداد k تبدیل کنیم. برای این کار هم به راحتی A را در بردارهای ویژه به دست آمده ضرب می کنیم. A گفتیم دارای ابعاد n*m,k بود و بردارهای ویژه هم k*k . با ضربشون بردارهای ویژه اصلی به دست میاد برای همون ماتریس کواریانس با ابعاد زیاد. یعنی بردارهای ویژه اصلی با ابعادn*m,k .
لازمه بگم که اگه شما از ماتریس کواریانس با ابعاد زیاد بردار ویژه شو به دست می اوردین ابعادش میشد n*m,n*m که بردارهای ویژه ما n*m,1 خواهد بود به تعداد n*m
اما با محاسبه بالا دیدیم که بردار ویژه نهایی شد n*m,k که به علت اینکه فرض کردیم k تصویر داریم که k عدد کوچکی نسبت به n*m است مشکلی نخواهیم داشت و همین تعداد بردار ویژه برای ما کفایت می کند. یک جور کاهش بعد داده ایم. باز اگه مشکلی بود بگید اگه بتونم توضیح میدم.
راستی برای هر ماتریسی تعداد نامتناهی می توانیم بردار ویژه در نظر بگیریم که ما دوست داریم بردار ویژه ای را برگزینیم که دارای شرط نرم یک باشد. اگه بردار ویژه هایی که تو زبان متلب محاسبه می کنید نرمشو محاسبه کنید می بینید همه یک هستند. بنابراین در اینجا پس از محاسبه بردارهای ویژه اصلی و نهایی که گفتم ابعادش n*m,k خواهد بود لازمه کاری کنیم که نرمشون یک بشه. برای این کار هم تمام مولفه های مربوط به یک بردار ویژه را تقسیم بر رادیکال مجموع مربعات تک تک مولفه های آن می کنیم. با این کار نرم آن به یک تبدیل میشه. این صحبتی که کردید در مورد اسپارس و خلوت نمی دونم چطوری میشه ازش استفاده کرد. به هر حال این تعداد بعد خیلی زیادن و باید از این راهی که گفتم برید.موفق باشید