資源簡介
由于本人最近需要處理的數據特征太多,導致分類不準確,特此學習了兩天的PCA,找了許多資料。整理了各位博主的偽代碼,并寫成matlab程序,然后自己利用matlab自帶的pca函數進行計算,兩種方法進行比較,程序已全副武裝,只需要導入自己數據就能運行。
代碼片段和文件信息
%%???感謝@chenyu19880302?博主的博客內容,它用通俗易懂的語言介紹了pca算法的原理和代碼,
%%%???本人將它的代碼進行整理,并換成自己的數據進行運算,發現它沒有用matlab自帶的pca函數
%%%???由于本人研究的是ERP內容,數據格式可能不一樣,所以運行的時候請自行修改一些參數
%%%???版權聲明:本文為博主原創文章,遵循?CC?4.0?BY-SA?版權協議,轉載請附上原文出處鏈接和本聲明。
%%%???本文鏈接:https://blog.csdn.net/chenyu19880302/article/details/9163303
%%%????導入數據格式為n*m,n為樣本數,m為特征數
%%?第一步:輸入樣本矩陣%%%%%%%%%%%%%%??500個樣本?62導聯?24個維度
vector=dataA;????%??此為導入數據,只需要修改dataA為自己的數據即可運行
newfeature=[];
%現對其進行pca降維??
for?chan=1:62
%第二步:計算樣本中每一維的均值,然后計算觀察值與均值之間的偏差,再計算協方差矩陣
?????feature=vector(:(chan-1)*24+1:(chan*24));??%?按導聯分開
????s=sum(feature1);%計算每一列的均值
????[nSmpnFea]?=?size(feature);
????feature=feature-repmat(mean(feature)nSmp1);%把每一維的均值復制成nSmp*nFea矩陣,然后計算偏差
????W=zeros(nFeanFea);%建立一個nFea*nFea的零矩陣
????W=W+feature‘*feature;
????W=W/(nSmp-1);%根據協方差公式計算協方差,得到協方差矩陣W
%第三步:計算協方差矩陣的特征值和特征向量矩陣
????fprintf(1‘Calculating?generalized?eigenvectors?and?eigenvalues...\n‘);
????[eigvectors?eigvalues]?=?eig(W);%eigvectors為特征向量組成的矩陣,eigvalues特征值組成的對角矩陣
????fprintf(1‘Sorting?eigenvectors?according?to?eigenvalues...\n‘);
????d1=diag(eigvalues);%返回對角矩陣上的值
????[d2index]=sort(d1);?%以升序排序,d2為排列后的值,index為索引值
????cols=size(eigvectors2);%?特征向量矩陣的列數
????for?i=1:cols
????vsort(:i)?=?eigvectors(:?index(cols-i+1)?);?%?vsort?是一個M*col(注:col一般等于M)階矩陣,保存的是按降序排列的特征向量每一列構成一個特征向量
????dsort(i)?=?d1(?index(cols-i+1)?);?%?dsort?保存的是按降序排列的特征值,是一維行向量
????end?%完成降序排列
%第四步:計算總能量,并選取貢獻率最大的特征值
????dsum?=?sum(dsort);%對所有的特征值求和
????dsum_extract?=?0;%求前幾個特征值之和當前幾個特征值之和大于預設值時,可以認為這幾個特征值可以表征當前矩陣
????p?=?0;
??
- 上一篇:matlab讀取hdf文件
- 下一篇:含過時信息多智能體系統一致性Matlab仿真
評論
共有 條評論