1.主成分分析的原理与步骤
在数学建模比赛当中,主成分分析主要是用于指标的降维,通过将众多的指标进行线性组合形成较少的“主成分”实现降维作用。也就是说用较少的指标能够尽可能的反映出原始数据的大量信息。
2.代码具体思路
假设数据是完整,无缺失值、无异常值的情况下。主成分分析的具体步骤可以分解为:
(1)将数据导入到MATLAB当中,形成原始样本矩阵。
(2)对数据进行预处理:
①数据标准化处理(Z-scores标准化):
②计算标准化样本的协方差矩阵
注:也可以综合成一步,求解样本的皮尔逊相关系数。
(3)计算R的特征值和特征向量
(4)计算主成分贡献率以及累积贡献率
(5)写出主成分
(6)画出
3.代码解读
本文使用的案例:清风老师的《棉花产量》,进行降维。
部分数据展示:
具体代码如下:
% (1)导入数据,生成样本数据矩阵cotton(数值矩阵)
% 样本数据矩阵里面,每一列分别代表年份 单产 种子费 化肥费 农药费 机械费 灌溉费
% 需要对数据第一列(年份)与第二列(单产)删除
cotton(:,[1,2])=[];
[n,m]=size(cotton);
%(2)对样本数据矩阵进行标准化处理:z-score
biaozhuncha=std(cotton);% 每一列的样本标准差
junzhi=mean(cotton);% 每一列的均值
% z-score标准化
standardization=(cotton-junzhi)./biaozhuncha;
% (3)对样本标准化数据求解协方差矩阵
xiefangcha=cov(standardization);
% (4)计算特征值与特征向量
[V,D]=eig(xiefangcha); %V是特征向量构成的矩阵;D是特征值构成的对角矩阵,V中的每一列就是D中对应特征值的特征向量
%(5)计算累积贡献率和主成分贡献率
dd=diag(D);
dd = dd(end:-1:1); % 因为特征值向量是从小大到排序的,需要将其调个头
Contribution=dd./sum(dd); % 主成分贡献率
Cumulative_contribution=cumsum(dd)./sum(dd); %计算累积贡献率
% 特征向量要和特征值一一对应,之前特征值相当于颠倒过来了,因此特征向量的各列需要颠倒过来
% rot90函数可以使一个矩阵逆时针旋转90度,然后再转置,就可以实现将矩阵的列颠倒的效果
V=rot90(V)';
disp('特征值为:')
disp(dd) % 转置为行向量,方便展示
disp('贡献率为:')
disp(Contribution)
disp('累计贡献率为:')
disp(Cumulative_contribution)
disp('与特征值对应的特征向量矩阵为:')
disp(V)
%(6)写出主成分
具体结果如下:
4.结果解析
表中可以看出,前两个主成分的累计贡献率为97.74%。特征向量矩阵每一行分别代表种子费 化肥费 农药费 机械费 灌溉费,每一列代表一个主成分。
5.PCA图像----使用origin
MATLAB画出的图像美观上不尽人意。因此在此处借用origin进行绘制相关图像。(也可以使用origin做主成分分析)
6.碎石图---使用origin
----------------------------------------该部分学习资料整理来自清风数学建模--------------------------------------