• 大小: 117KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-07-28
  • 语言: 其他
  • 标签: matlab  

资源简介

在实验中,我们可以把高维的数据进行降维,得到低维的数据,然后在进行分析。完美运行,你值得拥有。

资源截图

代码片段和文件信息

%程序说明:PCA= pca(X),程序中X为 n*m阶混合数据矩阵,m为信号个数即变量的个数,n为采样点数即样本个数
% T为主分量矩阵P为得分向量矩阵,Q和T2为统计量。

%function PCA= pca(X)
tic;
load(‘高维特征.mat‘)
X=features(:1:30);
[m n]=size(X);
if X == 0
error(‘You must supply the mixed data as input argument.‘);%判断是否输入数据
end
if length(size(X))>2
error(‘Input data can not have more than two dimensions. ‘);%判断输入数据维数
end
if any(any(isnan(X)))
error(‘Input data contains NaN‘‘s.‘);%判断输入数据是否含有非数值的数据
end

%——————————————标准化数据(首先去均值,然后标定到单位方差)————————————
a=0.99;
meanValue = mean(X); %求采集数据的样本均值
e=ones(size(X1)1);
s=std(X);
d=diag(s.^-10);
fprintf(‘Normalizing the input data X:\n‘);
normX = (X - e*meanValue)*d; %将采集数据去均值并标准化
[NumofSamplDim] = size(X); %最初采集数据的维数及每个变量样本的个数
oldDim = Dim;  %最初变量个数,即数据的维数
fprintf(‘Number of process variables: %d\n‘Dim);
fprintf(‘Number of samples of every variable: %d\n‘NumofSampl);
fprintf(‘Calculate PCA:\n‘);

%———计算协方差矩阵的特征值大于阈值的个数numEig(实际求出特征值中非零的特征值个数)———
firstEig=1;
numEig = 0;
covarianceMatrix = (1/(NumofSampl-1))*(normX‘*normX); %计算normX的协方差矩阵


[VD] = eig(covarianceMatrix) ; %计算协方差矩阵的特征值和特征向量全部特征值构成对角阵D,特征向量为V的列向量
threshold = 1e-5;
for n=1:Dim
   if D(nn)>threshold
       numEig=numEig+1;
   else if D(nn)<=threshold
       numEig=numEig;       %实际求出的特征值大于零的非零特征值的个数
       end
    end
end
%——————————降序排列各特征值——————————
eigenvalues = flipud(sort(diag(D))); %按从大到小顺序排列的所有的特征值
t=eigenvalues‘;
%fprintf(‘The eigenvalues are as follows: %g \n‘eigenvalues);
%fprintf(‘Number of non-zero eigenvalues: %d\n‘numEig);

%—————————去掉较小的特征值(去掉较小值的阈值是去掉最大和最小特征值的和求平均)——————————
if numEig < oldDim                %特征值的个数小于最初数据的维数的情况
lowerValue=(sum(eigenvalues)-eigenvalues(1)-eigenvalues(2))/numEig;
else
lowerValue=(sum(eigenvalues)-eigenvalues(1)-eigenvalues(numEig))/numEig; %特征值个数等于最初数据维数的情况
end
columns = diag(D) >=lowerValue ;%求得去掉较小特征值后的特征值向量(逻辑向量,大于设定值的特征值为1,小于设定值的为0)

%—————————合并选择的特征值,确定所选择则的特征值——————————
selectedColumns =columns ; 
newDim=sum(selectedColumns);
%—————————输出处理的结果信息—————————
fprintf(‘Selected[ %d ] dimensions.\n‘newDim);
fprintf(‘Smallest remaining (non-zero) eigenvalue: %g \n‘eigenvalues(numEig));
fprintf(‘Largest remaining (non-zero) eigenvalue : %g \n‘eigenvalues(firstEig));

%———————选择相应的特征值和特征向量———————
 B=V*fliplr(diag(selectedColumns));  %根据特征值大小,选择相应的特征向量
 y=find(sum(B)~=0);        %计算经过换算过的矩阵的列向量是否为0
 selectedEvector=B(:y);  %根据所选择的特征值,确定所选择的单位特征向量组成的新矩阵

%——————————计算负荷向量构成的矩阵———————————
disp(‘Calculate the loading vectors:‘);
P=selectedEvector ; %计算负荷向量P

%——————————提取主分量T————————————
disp(‘Calculate the score vectors:‘);
T= normX*P  ;   %计算得分向量,即主分量矩阵

%——————————计算Q统计量,即主元模型的SPE———————————
disp(‘Calculate the model prediction values:‘);
normXpre=T*P‘;  %计算归一化后的主元模型预测值矩阵
error=normX-normXpre;  %计算归一化的相对于主元模型的预测的误差
squaredError=error.^2  ;%计算归一化后的平方预测误差
disp(‘Calculate the Q statistic:‘);
Q=sum(squaredError2) ; %计算Q统计量

%——————————计算T统计量———————————
selectedEigvalue=diag(eigenvalues(1:newDim)); %计算所选择的特征值矩阵
disp(‘Calculate the T2 statistic:‘);
T2=diag(T*inv(selec

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5732  2018-10-15 10:02  pca降维算法\PCA.m

     文件     117313  2018-06-17 15:39  pca降维算法\高维特征.mat

     目录          0  2018-11-19 10:34  pca降维算法

----------- ---------  ---------- -----  ----

               123045                    3


评论

共有 条评论