主成分分析 Matlab

主成分分析的优缺点:

优点:化繁为简,降低了计算量。

缺点:一定程度上损失了精度。并且只能处理“线性问题”,这是一种线性降维技术。

总结:

假设我们拿到了一份数据集,有m个样本,每个样本由n个特征(变量)来描述,那么我们可以按照以下的步骤进行降维:

1、将数据集中的每个样本作为列向量,按列排列构成一个n行m列的矩阵;

2、将矩阵的每一个行向量(每个变量)都减去该行向量的均值,从而使得新行向量的均值为0,得到新的数据集矩阵X;

3、求X的协方差矩阵,并求出协方差矩阵的特征值λ和单位特征向量e;

4、按照特征值从大到小的顺序,将单位特征向量排列成矩阵,得到转换矩阵P,并按PX计算出主成分矩阵;

5、用特征值计算方差贡献率和方差累计贡献率,取方差累计贡献率超过85%的前k个主成分,或者想降至特定的k维,直接取前k个主成分。

主成分分析代码:

function [tg xs q px newdt]=pca(h)  %输入只能是以分析的指标变量为列,样本变量为行的数据!
h=zscore(h); %数据标准化
r=corrcoef(h); %计算相关系数矩阵
disp('计算的相关系数矩阵如下:');
disp(r);
[x,y,z]=pcacov(r);  %计算特征向量与特征值
s=zeros(size(z));
for i=1:length(z)
    s(i)=sum(z(1:i));
end
disp('由上计算出相关系数矩阵的前几个特征根及其贡献率:');
disp([z,s])
tg=[z,s];
f=repmat(sign(sum(x)),size(x,1),1);
x=x.*f;
n=input('请选择前n个需要计算的主成分:\n');
disp('由此可得选择的主成分系数分别为:');
for i=1:n
    xs(i,:)=(x(:,i)');
end
newdt=h*xs';
disp('以主成分的贡献率为权重,构建主成分综合评价模型系数:');
q=((z(1:n)./100)')
w=input('是否需要进行主成分综合评价?(y or n)\n');
if w==y
    df=h*x(:,1:n);
    tf=df*z(1:n)/100;
    [stf,ind]=sort(tf,'descend'); %按照降序排列
    disp('主成分综合评价结果排序:');
    px=[ind,stf]
else
    return;
end

你可能感兴趣的:(matlab常用代码,matlab,算法)