首先先来说明一下,主成分分析现在多用来进行数据的预处理,将大量数据进行降维处理后,再使用其他的算法进行进一步的分析,降维可以去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。(这个方法一般需要结合SPSS使用)

SPSS的使用方法:点击这里

当然,如果要对数据进行降维处理,我们还有其他的方法:比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

一、算法概念

主成分分析(PCA)是一种比较基础的数据降维方法,也是多元统计中的重要部分,在数据分析、机器学习等方面具有广泛应用。主成分分析目的是用较少的变量来代替原来较多的变量,并可以反映原来多个变量的大部分信息。

其实简单的说就是:保留数据重要的部分(所谓重要的部分,就是经过一系列变换后,特征值大的那部分数据),让重要的部分数据来代表整体的数据,从而完成数据的降维

二、算法流程

总结一下PCA的算法步骤

设有m条n维数据。

①数据标准化:计算每个特征的均值和标准差,然后将每个特征减去均值并除以标准差。这样可以确保每个特征的均值为0,方差为1。
②协方差矩阵计算:计算标准化后数据的协方差矩阵。协方差矩阵描述了不同特征之间的关联性(具体计算公式我也不太清楚,但是可以用matlab中的cov函数生成)。
③特征值和特征向量计算:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量
④特征值排序:按照特征值的大小对特征向量进行排序,选择前k个特征向量作为主成分。
数据投影:将标准化后的数据点乘以选择的主成分,得到降维后的数据。具体操作就是将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵P,那么Y=XP即为降维到k维后的数据。

这里重点理解一下降维:比如说我们现在有二十个人的身材数据,数据指标有六项,也就是20*6的矩阵,标准化后,我们会先把他变成一个6*6的矩阵,求特征向量特征值,之后我们选择主成分数量,这里我们选择前两个,下面所示,可以看到,第一个成分对于这六项指标都是正载荷,我们可以给他起个名字,叫做身材成分,第二个成分只对胸围肋围和腰围是正的,所以我们称之为胖瘦成分,这样的话,你将第一成分对应的特征向量对应乘以第一个人的六项身材数据,并把他们加一起,得到的数就是第一个人在主成分这里获得的分数,那么结果就显而易见了,本来的20*6的数据,在这样操作后,变成了20*2,这就完成了所谓的降维!amazing!

当然,有时候你想求一个人的总体得分,还可以让他第一主成分的得分*第一主成分对应的特征值/(第一主成分对应的特征值+第二主成分对应的特征值)+第二主成分得分*第二主成分对应的特征值/(第一主成分对应的特征值+第二主成分对应的特征值)。

SPSS 权重_人工智能

下面举个栗子

PCA透彻讲解

PCA基本的数学原理

更完善点的例子

三、算法应用

该算法主要还是应用在数据预处理的情况下,对数据进行降维处理,可以和聚类搭配使用。

四、算法优缺点

1.优点

①可比性:由于主成分分析过程对各个指标进行了标准化处理,所以使得各种不同度量的指标变换成了同度量的指标,同时也消除了原始数据数量级上的差别,使得各个指标间具有可比性及可加性。
②全面性:通过正交变换寻找主成分,克服了原始指标相关性的影响。
③合理性:在综合评价过程中,权数的确定是客观合理的,克服了某些评价方法中人为确定权数的缺陷。

2.缺点

①在主成分分析中,我们首先应保证所提取的前几个主成分的累计贡献率达到一个较高的水平,其次对这些被提取的主成分必须都能够给出符合实际背景和意义的解释,否则主成分将空有信息量而无实际意义。
②主成分的解释含义一般多少带点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价。
③其适用于变量间有较强相关性的数据,若原始数据相关性弱,则起不到很好的降维作用(必须通过KMO和Bartlett的检验),并且降维后,存在少量信息丢失,不可能包含100%原始数据,

五、算法代码

这是函数中包含的数据文档

SPSS 权重_人工智能_02

clear;clc
[X,textdata] = xlsread('shuju.xlsx');

%% 第一步:对数据X标准化为XZ
XZ=zscore(X);   % matlab内置的标准化函数(x-mean(x))/std(x),其中mean是用来求平均值的,std是用来求样本标准差的

%% 第二步:计算样本协方差矩阵,XZ矩阵有5列,所以协方差矩阵就是5*5(说白了就是要看每个因素之间的关系,五个因素来回组合,一共有25)
R = cov(XZ);

%% 注意:以上两步可合并为下面一步:直接计算样本相关系数矩阵(先将矩阵标准化求协方差矩阵是等同于直接对原矩阵求样本相关系数矩阵的)
R = corrcoef(X);
disp('样本相关系数矩阵为:')
disp(R)

%% 第三步:计算R的特征值和特征向量
% 注意:R是半正定矩阵,所以其特征值不为负数(这也就是为什么要先对矩阵进行变换)
% R同时是对称矩阵,Matlab计算对称矩阵时,会将特征值按照从小到大排列哦
[V,D] = eig(R);  % V 特征向量矩阵  D 特征值构成的对角矩阵

%% 第四步:计算主成分贡献率和累计贡献率
lambda = diag(D);  % diag函数用于得到一个矩阵的主对角线元素值(返回的是列向量)
lambda = lambda(end:-1:1);  % 因为lambda向量是从小大到排序的,我们将其调个头
contribution_rate = lambda / sum(lambda);  % 计算贡献率(贡献率就是这个成分的特征值在总特征值中的占比)
cum_contribution_rate = cumsum(lambda)/ sum(lambda);   % 计算累计贡献率  cumsum是求累加值的函数
disp('特征值为:')
disp(lambda')  % 转置为行向量,方便展示,在向量后面加个',会将向量转置
disp('贡献率为:')
disp(contribution_rate')
disp('累计贡献率为:')
disp(cum_contribution_rate')
disp('与特征值对应的特征向量矩阵为:')
% 注意:这里的特征向量要和特征值一一对应,之前特征值相当于颠倒过来了,因此特征向量的各列需要颠倒过来
%  rot90函数可以使一个矩阵逆时针旋转90度,然后再转置,就可以实现将矩阵的列颠倒的效果
V=rot90(V)';
disp(V)


%% 第五步:计算我们所需要的主成分的值
m =input('请输入需要保存的主成分的个数:  ');
F = zeros(15,m);  %初始化保存主成分的矩阵(每一列是一个主成分),创造一个15行m列的零矩阵,留着给最后的F用
for i = 1:m
   ai = V(:,i)';   % 将第i个特征向量取出,并转置为行向量
   Ai = repmat(ai,15,1);   % 将这个行向量重复n次,构成一个n*p的矩阵,N就是样本个数
   F(:, i) = sum(Ai.* X, 2);  % 注意,对标准化的数据求了权重后要计算每一行的和('.*'就是让两个矩阵按照元素相乘),
   %后面那个2就是对相乘的那一整行求和,理解为特征向量与对应的能力对应相乘再相加,然后就体现样本1的分数了
end

%ps:不用考虑主成分都对应原来矩阵的哪些元素,反正最后都是算总分数