主成分分析法

先定义几个数学概念:协方差:

相关系数:
image

现在有一个矩阵:每行表示一个城市,一共10列,代表10种数据

clc,clear
load PCA.txt %把原始数据保存在纯文本文件PCA.txt中
PCA=zscore(PCA); %数据标准化
r=corrcoef(PCA); %计算相关系数矩阵
%下面利用相关系数矩阵进行主成分分析,x的列为r的特征向量,即主成分的系数
[x,y,z]=pcacov(r) %y为r的特征值,z为各个主成分的贡献率
f=repmat(sign(sum(x)),size(x,1),1); %构造与x同维数的元素为±1的矩阵
x=x.*f; %修改特征向量的正负号,每个特征向量乘以所有分量和的符号函数值
num=4; %num为选取的主成分的个数
df=r*x(:,1:num); %计算各个主成分的得分
tf=df*z(1:num)/100; %计算综合得分
[stf,ind]=sort(tf,'descend'); %把得分按照从高到低的次序排列
stf=stf', ind=ind'

其中,得出的x[][],第一列表示第一个主成分的系数,第二列表示第二个主成分……z[]表示第1、2、3..个主成分的权值(贡献率,挑贡献率最大的那几个成分,比如这个例子中前4个主成分的和已经到98%了)
例如:image

image

得到的矩阵:image

image

代码中已经标准化了,所以就不需要再弄了
然后利用这个加权的主成分之和,就可以将多种类型的数据化成少数几种了

封装好的函数

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

↑调用的时候注意数据的每一行代表一个人,每一列代表一种数据
↓精简版的主成分分析

dd=load('data.txt');
sy=zscore(dd);
r=corrcoef(sy);
[vec1,val,con]=pcacov(r);
f1=repmat(sign(sum(vec1)),size(vec1,1),1);
vec2=vec1.*f1;
num=input("主因子个数:");
df = r*vec2(:,[1:num])
zhdf=df*con(1:num)/100
[stf,ind]=sort(zhdf,'descend');
stf=stf', ind=ind'
posted @ 2022-10-28 20:31  SkyRainWind  阅读(291)  评论(0编辑  收藏  举报