logo资料库

利用PCA降维方法处理高光谱图像(matlab).pdf

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
代码理解 2020年9月29日 10:54 matlab自带pca函数的详解 高光谱图像基于MATLAB的PCA降维 基于MATLAB的高光谱遥感数据的PCA运用 clear;clc; PU=load('PaviaU.mat'); data=PU.paviaU;%导入矩阵信息 [m,n,p]=size(data);%(610,340,103)%确定最终生成二维矩阵的大小 t=m*n;%207400 data=reshape(data,t,p);%(207400,103),即(样本数,波段数)降维(三维矩阵降为二维矩阵) 1. 导入matlab中的遥感数据是以结构体(struct)的形式存 在,不能直接当做矩阵进行运算。矩阵数据是结构体中的 一个属性,因此需要使用“.”来调用其中的矩阵信息。 2. 在降维之前需要确定最终生成二维矩阵的大小,在matlab 中我们可以使用自带的size( )函数对数据的大小进行查看。 [m,n,p]=size(data); 其中m表示三维矩阵的行,n表示列, p表示页,data是作为参数传入size() [pc,score,latent,tsquare]=pca(data);%pc为主成分系数,score为主成分的结果,latent为方差 3. 对数据进行降维 feature_after_PCA=score(:,1:3); RES=reshape(feature_after_PCA,m,n,3);%取前三维,把矩阵还原为三维 % imwrite(RES(:,:,1),'1.jpg'); % imwrite(RES(:,:,2),'2.jpg'); % imwrite(RES(:,:,3),'3.jpg'); imwrite(RES,'PU_pca_3.jpg') %cumsum(latent)./sum(latent) %ans =0.5832,0.9442,0.9886,0.9916,0.9937 subplot(1,3,1);imshow(RES(:,:,1)); subplot(1,3,2);imshow(RES(:,:,2)); subplot(1,3,3);imshow(RES(:,:,3)); 将三维数据降维成二位数据,需要使用软件自带的一个函数 (reshape( )函数),关于reshape( )函数的具体使用可以在 Command window中输入 help reshape进行查看运用的规 则。 数据降维的关键思想:如何将三维数据压缩成二维,举 例便知。 有一个5*6*7的三维矩阵,是否可以转换成7*30的二维矩 阵?答案是可以的分析:5*6*7的三维矩阵中包含的元素个 数是210个,转换之后的二维矩阵所包含的元素个数是不是 也是210 data=reshape(data,p,t);%data为传入的三维数组,p为最 终得到二维矩阵行的个数,t为最终得到二维矩阵列的个数 来自 分区 高光谱数据的pca处理(matlab) 的第 1 页
pca函数 2020年9月29日 17:13 matlab 自带函数pca的用法 因为pca在各个学科都有使用,每个学科对于名词的叫法都不太一样,使用的目的都不太一样,我就是单纯的想使用降维,发现matlab函数的 pca函数的输入参数除了数据集X还有10个....弄了一段时间才明白....这里分享一下.有错误和不清楚的还请大家指正 数据集X(每行为一个样本,行数为样本数) pc为主成分系数,score为主成分的结果,latent为方差 - coeff = pca(X) - coeff = pca(X,Name,Value) - [coeff,score,latent] = pca(___) - [coeff,score,latent,tsquared] = pca(___) - [coeff,score,latent,tsquared,explained,mu] = pca(___) i.e Input Argument 0 X :--数据集 假设n个样本, 每个样本p维,则 X是n-by-p的matrix(矩阵) Input Argument 1 'Algorithm' — Principal component algorithm(算法) 'svd' (default) | 'eig' | 'als' 解释:PCA 涉及到求协方差矩阵的特征向量, 在matlab 有3中算法 默认 :SVD, eig (Eigenvalue decomposition )算法, 此算法当n(number of examples) > p (features) 时,速度快于SVD,但是计算的结果没有SVD精确 als( Alternating least squares )算法,此算法为了处理数据集X中有少许缺失数据时的情况(i.e 0), 但是对于X为稀疏数据集(缺失数据过多)时, 不好用 Input Argument 2 'Centered' — Indicator for centering columns true (default) | false 解释:选择是否对数据进行中心化, 也是数据的特征是否进行零均值化(i.e.按列减去均值, 为了得到covariance matrix), 如果选择了true, 则可用score*coeff'恢复中心化后的X, 若选择了false,则可用score*coeff' 恢复原始的X 默认:true(中心化) Input Argument 3 'Economy' — Indicator for economy size output true (default) | false 解释: 有时候输出的coeff(映射矩阵p-by-p)过大, 而且是没有必要的(因为我们要降维),所以可以只输出coeff(以及score,latent)的前d列, d是数据集的自由度,数据集没NAN的时候d=n-1; 具体的解释见matlab.总之如果将看见完整的PCA结果,可以设置为false. 默认:true ,(默认ture以后对于初次使用matlab这个函数的人非常迷惑). Input Argument 4 'NumComponents' — Number of components requested number of variables (default) | scalar integer 解释:输出指定的components 也就是更为灵活的Economy,但是经过试验发现指定成分数 仅在小于d(自由度)时有效,大于d时无效; 默认: number of variables ( i.e p,特征数目) Input Argument 5 'Rows' — Action to take for NaN values 'complete' (default) | 'pairwise' | 'all' 解释: 此选项是为了智能处理数据集X中含有NAN的情况, complete: 计算之前.移除X中含有NAN的行(i.e 样本),计算完成后,含有NAN的行被重新插入到 score and tsquared相应的位置中(coeff呢?) pairwise : 首先这个选项必须配合 'Argorithm'中 'eig'进行使用.如果没有指定'eig'(默认svd), 当指定pairwise时,则会自动切换为eig; 指定为svd,则会发送warning message, 分区 高光谱数据的pca处理(matlab) 的第 2 页
当指定pairwise时,则会自动切换为eig; 指定为svd,则会发送warning message, 然后自动切换为eig;若指定为als, 则会发送warning message然后忽略 'Rows'此选项. 成功使用此选项时,若计算协方差(i,j)处值时遇到NAN,则使用X中第i或j列中不含NAN 的行此处来计算的协方差值. all : 当确定X中无缺失数据,使用'all',则pca会使用X中所有的数据,当遇到NAN时则会自动终止. 默认:complete Input Argument 6 'Weights' — Observation weights ones (default) | row vector 解释: 基于observations(i.e 样本)的权重pca,有需求的可以自己查查 Input Argument 7 'VariableWeights' — Variable weights row vector | 'variance' 解释:基于variables(i.e.features)的权重pca,有需求的自己查 默认: 无默认值, 也就是默认不使用此选项 Input Argument 8 'Coeff0' — Initial value for coefficients matrix of random values (default) | p-by-k matrix 解释: Initial value for the coefficient matrix coeff, 不是太看的懂,但是要配合'Algorithm'中的 'als'使用 默认: p-by-random Input Argument 9 'Score0' — Initial value for scores matrix of random values (default) | k-by-m matrix 解释: Initial value for scores matri score.不是太看的懂,但是要配合'Algorithm'中的 'als'使用 默认 : n-by-random Input Argument 10 'Options' — Options for iterations structure(此用法是个结构体) 解释:用于迭代的选项,仅配合'Algorithm'中的'als'使用. 因为'als'是使用迭代的方法进行计算的 对这个不感兴趣, 有兴趣的可以去help一下 附上help中的使用方法 opt = statset('pca'); opt.MaxIter = 2000; coeff =pca(X,'Options',opt); Output Argument 1 coeff : 主成分系数 应该就是协方差矩阵的特征向量矩阵(也就是映射矩阵). 完整输出的情况下是一个p-by-p 的matrix.每一列都是一个特征向量.按对应的特征值 的大小,从大到小进行排列. Output Argument 2 score: 进行旋转(也就是利用映射矩阵coeff进行)后的结果i.e. score = X * coeff. n-by-p matrix 这里有个坑 如果你使用pca时使用的是默认的中心化(i.e 不对'Centered'设置'false'), 拿X *coeff 和score对比的时候, 记得把X中心化后再乘以coeff,之后再和score对比....; 同样如果pca使用的是默认值, 恢复的X = score * coeff' (注意转置)是中心化后的数据 Output Argument 3 latent: 主成分方差 也就是各特征向量对应的特征值,从大到小进行排列 Output Argument 4 tsquared :层次不够 无法解释...... Output Argument 5 explained : 每一个主成分所贡献的比例,可以更直观的选择所需要降维的维数了,不用再用特征值去求了 Output Argument 6 mu: X 按列的均值,当前仅当 'Centered'置于'true'(默认值)时才会返回此变量 分区 高光谱数据的pca处理(matlab) 的第 3 页
[pc,score,latent,tsquare] = pca(feature);%我们这里需要他的pc和latent值做分析 feature是被降维的特征,每一行是一个特征,列数代表总的特征个数,比如一个图片的HOG特征是96维,总共有8000个HOG特征,那么feature 的维度是8000×96,我们的目标就是将其降维(假设将96维降到50维,)那么我们期望的降维后feature就变成了我们需要的 feature_after_PCA:8000×50 latent用来计算降维后取多少维度能够达到自己需要的精度, 通过下面的代码运行结果可以得到取pc中对应每一维度对原始数据的精度: 1. 2. 3. 4. 5. 6. 7. 8. 9. cumsum(latent)./sum(latent) 0.2763 0.3954 0.8765 0.8854 0.8931 0.8995 0.9055 0.9111 10. 0.9808 11. 0.9819 12. 0.9828 13. 0.9838 14. 0.9846 15. 0.9854 16. 0.9862 17. 0.9869 18. 0.9876 19. 0.9883 20. 0.9999 21. 1.0000 22. --------------------- 结果应该是有96维,但是太长,这里随机删减了一部分,我们可以看到只去取第一维的话和原始数据的准确度只有27%,很低,取全部的维度最后 的精度就是100%,如果我们觉得精度达到90%就能接受的话我们就只需要取精度为90%对应的维度,这里假设第50维的精度是90%. 因此我们需要取pc中的1:50列来做最后的变换矩阵: tran=pc(:,1:50); 因此我们最终的feature降维后的矩阵feature_after_PCA就通过下式计算: 1. 2. feature= bsxfun(@minus,feature,mean(feature,1)); feature_after_PCA= feature*tran; 至此我们PCA降维完成.这里需要人工介入的地方就是选取多少维度来确定和原始数据的精度问题. 补充:上面计算feature_after_PCA的方法是正确的,但是pca函数其实已经给出了所有的转换后矩阵表示,也就是输出的score项,因此在确定需 要降维到50维度以后,只需要取score中对应的列就能得到feature_after_PCA: feature_after_PCA=score(:,1:50); 来自 分区 高光谱数据的pca处理(matlab) 的第 4 页
高光谱图像基于MATLAB的PCA降维 2020年9月29日 17:15 工具:matlab,本人使用的是2016a 使用数据集用公开的Salinas数据集为例,Salinas数据集为512*217*204,即它有204个波段,我们要把它从204维 降至3维。 matlab中内含了进行PCA降维的函数,但这个函数输进去的数据要是二维的,所以我们先用resharp函数把原矩阵 处理成111104*204的矩阵M 再使用自带的降维函数: [pc,score,latent,tsquare] = pca(M) latent用来计算降维后取多少维度能够达到自己需要的精度, 通过下面的代码运行结果可以得到取pc中对应每一维度对原始数据的精度: 在命令行输入 cumsum(latent)./sum(latent) 部分截如下 我们可以看到只去取第一维的话和原始数据的准确度只有74.4%,我们取到第三维,此时已有99%的精度,一般来 说取到90%以上即可。 再取前三维,把矩阵还原为三维。此时便已完成了对高光谱图像的降维。 完整代码如下: M=reshape(d,111104,204); [pc,score,latent,tsquare] = pca(M); feature_after_PCA=score(:,1:3); RES=reshape(feature_after_PCA,512,217,3); 导入进来的矩阵命名为d 把它转为图片看看效果: imwrite(RES(:,:,1),’1.jpg’); 分区 高光谱数据的pca处理(matlab) 的第 5 页
分区 高光谱数据的pca处理(matlab) 的第 6 页
来自 分区 高光谱数据的pca处理(matlab) 的第 7 页
matlab代码 2020年9月29日 17:16 高光谱图像降维matlab代码 求使用PCA和低秩张量分解的方法对高光谱图像降维的matlab代码,谢谢大家 使用MATLAB对PaviaU数据集进行PCA降维,降为三维 P=load('PaviaU.mat'); [m,n,band]=size(P.paviaU); ReshapedP=reshape(P.paviaU,m*n,band); [coeff,score,latent,tsquared] = pca(ReshapedP); percent=cumsum(latent)./sum(latent); disp(percent); feature_after_PCA=score(:,1:3); RES=reshape(feature_after_PCA,m,n,3); subplot(131);imshow(RES(:,:,1)); subplot(132);imshow(RES(:,:,2)); subplot(133);imshow(RES(:,:,3)); 分区 高光谱数据的pca处理(matlab) 的第 8 页
分享到:
收藏