PCA实现代码
来源:互联网 发布:信达软件下载 编辑:程序博客网 时间:2024/06/05 18:56
整了几天,终于把pca的matlab代码完成了。你妹哦,网上的代码太坑人了!!
function [y whiteningMatrix] = pcaRecogFace(mixedsig,rankTolerance)%程序说明:y = pca(mixedsig),程序中mixedsig为 n*T 阶混合数据矩阵,n为信号个数,T为采样点数% y为 m*T 阶主分量矩阵。% n是维数,T是样本数。%%rankTolerance表示最小特征值。%——————————————去均值————————————meanValue = mean(mixedsig')';[m,n] = size(mixedsig);for s = 1:m for t = 1:n mixedsig(s,t) = mixedsig(s,t) - meanValue(s); endend[Dim,NumofSampl] = size(mixedsig);oldDimension = Dim;fprintf('Number of signals: %d\n',Dim);fprintf('Number of samples: %d\n',NumofSampl);fprintf('Calculate PCA...');firstEig = 1;lastEig = Dim;covarianceMatrix = corrcoef(mixedsig'); %计算协方差矩阵[E,D] = eig(covarianceMatrix); %计算协方差矩阵的特征值和特征向量%———计算协方差矩阵的特征值大于阈值的个数lastEig———maxLastEig = sum( diag(D) > rankTolerance );lastEig = maxLastEig;%——————————降序排列特征值——————————eigenvalues = flipud(sort(diag(D)));%—————————去掉较小的特征值——————————if lastEig < oldDimension lowerLimitValue = (eigenvalues(lastEig) + eigenvalues(lastEig + 1))/2;else lowerLimitValue = eigenvalues(oldDimension) - 1;endlowerColumns = diag(D) > lowerLimitValue;%—————去掉较大的特征值(一般没有这一步)——————if firstEig > 1 higherLimitValue = (eigenvalues(firstEig - 1) + eigenvalues(firstEig))/2;else higherLimitValue = eigenvalues(1) + 1;endhigherColumns = diag(D) < higherLimitValue;%—————————合并选择的特征值——————————selectedColumns =lowerColumns & higherColumns;%—————————输出处理的结果信息—————————fprintf('Selected [%d] dimensions.\n',sum(selectedColumns));fprintf('Smallest remaining (non-zero) eigenvalue[ %g ]\n',eigenvalues(lastEig));fprintf('Largest remaining (non-zero) eigenvalue[ %g ]\n',eigenvalues(firstEig));fprintf('Sum of removed eigenvalue[ %g ]\n',sum(diag(D) .* (~selectedColumns)));%———————选择相应的特征值和特征向量———————E = selcol(E,selectedColumns);D = selcol(selcol(D,selectedColumns)',selectedColumns);%——————————计算白化矩阵———————————whiteningMatrix = inv(sqrt(D)) * E';dewhiteningMatrix = E * sqrt(D);%——————————提取主分量————————————y = whiteningMatrix * mixedsig;%——————————行选择子程序———————————function newMatrix = selcol(oldMatrix,maskVector)if size(maskVector,1)~= size(oldMatrix,2) error('The mask vector and matrix are of uncompatible size.');endnumTaken = 0;for i = 1:size(maskVector,1) if maskVector(i,1) == 1 takingMask(1,numTaken + 1) = i; numTaken = numTaken + 1; endendnewMatrix = oldMatrix(:,takingMask);
将上述代码在贝母中,按第一主成分、第二主成分和第三主成分分别形成图像,效果如下:
可见,通过不同主成分投影,结果是使得数据更有差异。在代码中为何采用白化矩阵进行投影还有待后续研究。
- PCA实现代码
- PCA python代码实现
- 快速pca实现代码
- PCA的python代码实现
- PCA和LDA的OpenCV代码实现--预告
- 基于PCA的人脸识别的Matlab实现代码
- PCA,LDA的C++实现(内附代码~)
- PCA+SVM代码
- PCA降维代码
- PCA代码及其注释
- PCA:理解与实现
- pca算法的实现
- PCA的MATLAB实现
- PCA降维实现
- PCA matlab实现
- Matlab实现PCA
- PCA算法实现
- PCA算法实现
- I'm Fine.
- 黑马程序员_技术加强之反射
- NSDateFormatter的格式字符串
- 【Error】Call requires API level 3 (current min is 1)解决办法
- android的Menu使用
- PCA实现代码
- Java内存泄露监控工具:JVM监控工具介绍
- 上传图片文件
- HttpServlet详解
- mysql数据库在表中指定位置增加一列
- Linux 中新装jdk替换以前的jdk方法
- awk使用
- C语言中的size_t类型
- GPIO的数据寄存器和上拉电阻/下拉电阻使能寄存器的说明