آموزش تحلیل مولفه اساسی یا PCA در متلب - قسمت دوم

با سلام 

خب در این قسمت قصد داریم استفاده از تکنیک PCA را توی یه پروژه توضیح بدیم :

فرض کنید شما تو فاز استخراج ویژگی، یه سری ویژگی رو بدست آوردین، الان میخواین ابعاد این ویژگی ها رو کاهش بدین. خب شروع میکنید به نوشتن یه تابع برای PCA و بردار ویژگی هاتون رو هم به عنوان ورودی بهش میدین. 

حالا داخل تابع چی بنویسیم؟ فاز اول میانگین گیری هستش، از چی؟ از همون بردار ویژگی که به عنوان ورودی بهش دادین. بعد از این باید اختلاف بردار ویژگی رو از بردار میانگین بدست بیارین.

فاز دوم محاسبه ی کواریانس، ماتریس کواریانس یه ماتریس N*N هستش، میتونیم از این ماتریس K تا بردار ویژه رو بدست بیاریم. واسه همین از تابع eig استفاده میکنیم، چون ایشون بردار ویژه و مقادیر ویژه رو از یه ماتریس واسمون فرآهم میکنن. 

فاز سوم تغییر مختصات، الان ما بردار ویژه و مقادیر ویژه رو داریم، پس داده هامون رو میبریم به مختصات جدید، پس از دستور diag استفاده میکنین. 

خب پس در کل به این نتیجه رسیدیم که بردارهای ویژگی N بعدی براساس K بردار مشخصه، به فضای K بعدی نگاشت میشن. 

حالا خروجی تابع PCA، به عنوان ورودی به شبکه عصبی (مثلا تو پروژتون از شبکه عصبی استفاده کردین) داده میشه واسه آموزش شبکه. 

راستی یه فیلم آموزشی فارسی در زمینه ی PCA هست، که میتونین از لینک زیر تهیه کنید :

http://faradars.org/courses/mvrnn9102mn-principal-component-analysis-pca-in-matlab

آموزش تحلیل مولفه اساسی یا PCA در متلب - قسمت اول

با سلام 

در این پست میخوایم راجب تحلیل مولفه اساسی یا PCA بحث کنیم. 

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

خب مگه PCA چی کار میکنه؟ میاد محورهای مختصات جدیدی واسه داده ها تعریف میکنه. اولین محور باید در جهتی باشه که پراکندگی داده ها بیشتره و دومین محور عمود بر محور اولی و در جهتی که واریانس داده ها بیشتره و به همین ترتیب بردارهای دیگه عمود بر محورهای قبلی در جهتی که پراکندگی داده ها بیشتر باشه.  PCA سعی میکنه تو فرآیند کاهش ابعاد، اون داده هایی که مهم هستن رو نگه داره و اضافی ها رو حذف کنه، توجه کنین چه قدر تو این تکنیک به پراکندگی داده ها اشاره میکنیم، مدام میگیم هرجایی که پراکندگی داده ها بیشتر باشه. 

خب در اینجا یه سورس کد از mathworks واستون گذاشتم :

% PCA 
% Written by SIAMAK FARIDANI
% I used this tutotial
% www.cs.otago.ac.nz/cosc453/student_tutorials/principal_components.pdf
clc; close all; clear all; numdata=20; %should be even %step 1, generating a dataset x1=rand(numdata/2,1); y1=rand(numdata/2,1); x2=3*rand(numdata/2,1)+3; y2=3*rand(numdata/2,1)+3; x=[x1;x2]; y=[y1;y2]; %step 2, finding a mean and subtracting xmean=mean(x); ymean=mean(y); xnew=x-xmean*ones(numdata,1); ynew=y-ymean*ones(numdata,1); subplot(3,1,1); plot(x,y, 'o'); title('Original Data'); %Uncomment to see the data after the deduction of the mean %subplot(4,1,2); %plot(xnew,ynew, 'o'); %title('mean is deducted') %step 3, covariance matrix covariancematrix=cov(xnew,ynew); %step 4, Finding Eigenvectors [V,D] = eig(covariancematrix); D=diag(D); maxeigval=V(:,find(D==max(D))); %step 5, Deriving the new data set %finding the projection onto the eigenvectors finaldata=maxeigval'*[xnew,ynew]'; subplot(3,1,2); stem(finaldata, 'DisplayName', 'finaldata', 'YDataSource', 'finaldata'); title('PCA 1D output ') %we do a classification now subplot(3,1,3); title('Final Classification') hold on for i=1:size(finaldata,2) if finaldata(i)>=0 plot(x(i),y(i),'o') plot(x(i),y(i),'r*') else plot(x(i),y(i),'o') plot(x(i),y(i),'g*') end end