主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异,将我们手中许多相关性很高的变量转化成彼此独立或者不相关的变量。通常是选出比原始变量个数少,能解释大部分资料中的变异的几个新变量,即所谓主成分,并用以解释资料的综合性指标。主成分分析实际上是一种降维方法。
也是为了方便自己,举例。
举例:下面是y和x1、x2、x3、x4之间的关系数据共13组,见表。对数据实施标准化得到数据矩阵A,则A‘*A/12就是样本相关系数阵。
计算的Matlab程序如下:
clc,clear;
load ch.txt; %把原始数据的x1,x2,x3,x4,y的数据保存在纯文本文件ch.txt中
[m,n]=size(ch);
x0=ch(:,[1:n-1]);y0=ch(:,n);
hg1=[ones(m,1),x0]\y0; %计算普通最小二乘法回归系数
hg1=hg1' %变成行向量显示回归系数,其中第一个分量是常数项,其他按x1,x2,...,xn排序
fprintf('对Hald数据做线性回归的经验回归方程:\n'); %开始显示普通最小二乘法回归结果
fprintf('y=%f',hg1(1));
for i=2:n
if hg1(i)>0
fprintf('+%f*x%d',hg1(i),i-1);
else
fprintf('%f*x%d',hg1(i),i-1);
end
end
fprintf('\n');
r=corrcoef(x0); %计算相关系数
xd=zscore(x0); %对设计矩阵进行标准化处理
yd=zscore(y0); %对y0进行标准化处理
[vec1,lamda,rate]=pcacov(r);
f=repmat(sign(sum(vec1)),size(vec1,1),1);
vec2=vec1.*f;
contr=cumsum(rate)/sum(rate);
df=xd*vec2;
num=input('请选择主成分的个数:');
fprintf('主成分回归方程系数:\n');
hg21=df(:,1:num)\yd
fprintf('化成标准量的回归方程系数:\n');
hg22=vec2(:,1:num)*hg21
hg23=[mean(y0)-std(y0)*mean(x0)./std(x0)*hg22,std(y0)*hg22'./std(x0)];
fprintf('恢复到原始的自变量,得到的主成分回归分析方程:\n');
fprintf('y=%f',hg23(1));
for i=2:n %开始显示主成分回归结果
if hg23(i)>0
fprintf('+%f*x%d',hg23(i),i-1);
else
fprintf('%f*x%d',hg23(i),i-1);
end
end
fprintf('\n');
%下面计算两种回归分析的剩余标准差
rmse1=sqrt(sum((hg1(1)+x0*hg1(2:end)'-y0).^2)/(m-n-1))
rmse2=sqrt(sum((hg23(1)+x0*hg23(2:end)'-y0).^2)/(m-num))
主成分个数的选取,根据相关系数阵的特征值进行初步判断,四个值分别是:2.2357,1.5761,0.1866,0.0016,因为最后一个接近于0,前三个累计贡献率达到0.999594,因此我们选择3个。
运行结果:
因为rmse1<rmse2,所以发现主成分回归均方误差更小,因而更稳定。而且Hald线性回归系数无法通过显著性检验,一般对多元回归系数进行t检验。
曲线对比图像: