赞
踩
如图1所示:
如图2所示:
【1】原始数据标准化处理
【2】计算样本 相关系数矩阵
【3】计算 相关系数矩阵 R的特征值和相应的特征向量
【4】选择主成分
【5】计算主成分得分
【6】依据主成分得分对问题分析与建模
如图4所示:
如图5所示:
如下所示:
%== PCA stepping demonstration program==% % Read data from a file (e.g. excel) and place it in a matrix. A=xlsread('Coporation_evaluation.xlsx', 'B2:I16'); % Transfer orginal data to standard data a=size(A,1); % Get the row number of A b=size(A,2); % Get the column number of A for i=1:b SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i)); % Matrix normalization end % Calculate correlation matrix of A. CM=corrcoef(SA); % Calculate eigenvectors and eigenvalues of correlation matrix. [V, D]=eig(CM); % Get the eigenvalue sequence according to descending and the corrosponding % attribution rates and accumulation rates. for j=1:b DS(j,1)=D(b+1-j, b+1-j); end for i=1:b DS(i,2)=DS(i,1)/sum(DS(:,1)); DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1)); end % Calculate the numvber of principal components. T=0.9; % set the threshold value for evaluating information preservation level. for K=1:b if DS(K,3)>=T Com_num=K; break; end end % Get the eigenvectors of the Com_num principal components for j=1:Com_num PV(:,j)=V(:,b+1-j); end % Calculate the new socres of the orginal items new_score=SA*PV; for i=1:a total_score(i,2)=sum(new_score(i,:)); total_score(i,1)=i; end new_score_s=sortrows(total_score,-2); % Displays result reports disp('特征值及贡献率:') DS disp('阀值T对应的主成分数与特征向量:') Com_num PV disp('主成分分数:') new_score disp('主成分分数排序:') new_score_s
【1】由于原始数据的数量级(量纲)常常不同,所以我们首先要对不同的变量类型进行标准化,消除量纲的影响。具体就是每个值减去该变量类型均值然后除以该变量类型的标准差。
【2】计算样本相关系数矩阵就直接是按照图6方式求解即可,图3中公式有误。
【3】计算相关系数矩阵R的特征值和相应的特征向量。使用函数可直接求得[V,D]。矩阵V是一列列的特征向量,而D是对角矩阵,对角线上的值就是特征值,并且特征值是由小到大排序的(越往右下)。
【4】将特征值由大到小排序,然后计算贡献度和累计贡献度:贡献度=特征值/特征值之和;累计贡献度=从第一行到此行特征值之和/总特征值之和。
【5】设定阈值,选择主成分(特征值和对应的特征向量)。规定阈值T是主成分需要累计的贡献度。当累计贡献度大于等于T即完成特征值的选择。
【6】翻转得到主成分包含的特征值对应的特征向量。将标准化矩阵映射到主成分上。计算每一组得分:得分=每一行主成分得分之和。就得到了原始数据在主成分(降维)上的得分。
%读取数据 A=xlsread('Coporation_evaluation.xlsx', 'B2:I16'); %获得A的行数和列数 a=size(A,1); b=size(A,2); for i=1:b %A矩阵标准化处理为SA:(每一个值-该列平均值)/该列标准差 SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i)); end %获得标准化矩阵SA的相关系数矩阵 CM=corrcoef(SA); %获得相关系数矩阵的特征值D和对应的特征向量V [V, D]=eig(CM); %将特征值从大到小排序 for j=1:b DS(j,1)=D(b+1-j, b+1-j); end for i=1:b %计算贡献度(贡献度=特征值/特征值之和) DS(i,2)=DS(i,1)/sum(DS(:,1)); %计算累计贡献度(累计贡献度=从第一行到此行特征值之和/总特征值之和) DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1)); end %选择主成分(特征值) T=0.9; for K=1:b %规定T是主成分需要累计的贡献度 %当累计贡献度大于等于T即完成特征值的选择(由D(1,1)到D(Com_num,1)) if DS(K,3)>=T Com_num=K; break; end end %因为之前将特征值反转(从函数返回的默认从小到大返回为从大到小),而每个特征值对应的特征向量也应该是“逆对应”关系 %获得主成分特征值对应的特征向量(特征值由1到Com_num,特征向量由到倒数第一到倒数第Com_num) for j=1:Com_num PV(:,j)=V(:,b+1-j); end %将标准化矩阵映射到主成分上(降维)获得主成分得分矩阵(标准化消除量纲+主成分映射降维)new_score new_score=SA*PV; %计算得分 for i=1:a %得分=每一行主成分得分之和 total_score(i,2)=sum(new_score(i,:)); %设置序号 total_score(i,1)=i; end %按照第二列进行排序。负整数表示排序顺序为降序。 new_score_s=sortrows(total_score,-2); disp('特征值及贡献率:') DS disp('阀值T对应的主成分数与特征向量:') Com_num PV disp('主成分分数:') new_score disp('主成分分数排序:') new_score_s
【1】PCA主成分分析方法:
针对于:多个变量存在一定相关性时;
适用于:变量个数较多或者变量之间存在复杂的关系时;
作用是:消除评价指标间的相关影响(如果互相有关联关系,则都评价肯定是不合理不客观不公正的,关联性越强越不合理PAC作用越强)。可减少指标选择工作量(减少指标个数)。
【2】案例作用分析:
企业的各个评价指标之间明显是有关联的。所以直接标准化然后计算得分是不合理的。主成分分析法就提取出互不相关的变量(维度),然后标准化数据进行映射,提取出主成分来评价。作用:(主要)是消除了指标之间的相关影响,(次要)是减少了变量个数减少了计算。
【1】std(A):求向量A的标准差。
【2】mean(A):求矩阵A的平均值。
【3】corrcoef(A):求矩阵A的相关系数矩阵。
【4】eig(A)=[V,D]:求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。
【5】 sortrows (X, COL):按指定列COL由小到大进行排序。若COL为负数表示按照降序排列。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。