你也能看懂的:主成分分析法

主成分分析(PCA)是一种统计分析、简化数据集的方法。它利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分。具体地,主成分可以看做一个线性方程,其包含一系列线性系数来指示投影方向。PCA对原始数据的正则化或预处理敏感(相对缩放)。


概念

主成分分析就是对数据进行降维操作,这样在面对多变量大样本的数据时可以明显地减少工作量,而且不至于损失太多信息

先解释一下原理:以房子为例,评价一套房子需要考虑很多因素,有价格、面积、位置、楼层、年份等,其中很多因素是相关的,比如面积更大的价格就会高一点,因此会出现一些冗余,我们可以通过更少的特性总结每套房子,就像现在都是通过每平方米多少人民币和一些修饰来描述某套房子

但是主成分分析并不是选择一些特性然后丢弃其余,相反,它是创建一些新特性,而且这些新特性能够很好地评价我们的房子。当然,这些新特性是由旧特性构建的,比如用每平方米的价格比上便利程度(考虑交通、楼层等得出一个便利度的分数)并将其定义为性价比,之后把所有房子都通过性价比来进行评价

建立的新特性可以体现房子的价值,而且能够尽可能好地重建原本特性的属性


主成分分析法的流程

以一组数据为例

  1. 找到一个方向向量,当把所有的数据都投射到该向量上时,投射平均均方误差要尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度:
    在这里插入图片描述
    每个点到它们对应的直线上的投影点之间的距离非常小。所以 PCA 会找一个低维平面(上图中是这条直线)然后将数据投影在上面,使点到投影点之间的距离的平方最小

  2. 计算出所有特征的均值,然后令 x j = x j − μ j x_j=x_j-\mu_j xj=xjμj :如果特征是在不同的数量级上,我们还需要将其除以标准差 σ 2 \sigma^2 σ2
    μ j = 1 m ∑ i = 1 m x j ( i ) \mu_j=\frac 1m \sum_{i=1}^mx_j^{(i)} μj=m1i=1mxj(i)

  3. 计算协方差矩阵:
    Σ = 1 m ∑ i = 1 n ( x ( i ) ) ( x ( i ) ) T \Sigma=\frac1m\sum_{i=1}^n(x^{(i)})(x^{(i)})^T Σ=m1i=1n(x(i))(x(i))T

  4. 计算协方差矩阵 Σ \Sigma Σ 的特征向量,利用奇异值分解来求解:
    [ U , S , V ] = s v d ( s i g m a ) [U,S,V]=svd(sigma) [U,S,V]=svd(sigma)

训练集的方差为:
1 m ∑ i = 1 m ∣ ∣ x ( i ) ∣ ∣ 2 \frac1m\sum_{i=1}^m||x^{(i)}||^2 m1i=1mx(i)2

三维下图形就是这样:
在这里插入图片描述


案例解读:

使用 MatLab 语言

A = x; % x 是需要分析的数据,自行导入
a = size(A,1); %获得矩阵A的行大小
b = size(A,2); %获得矩阵A的列大小
for i = 1:b
    SA(:,i) = (A(:,i)-mean(A(:,i)))/std(A(:,i)); % std 函数是用来求向量的标准差
end

%计算相关系数矩阵的特征值和特征向量
CM = corrcoef(SA); %计算相关系数矩阵
[V,D] = eig(CM); %计算特征值和特征向量
for j = 1:b
    DS(j,1) = D(b+1-j,b+1-j); %对特征值按降序排列
end
for i = 1:b
    DS(i,2) = DS(i,1)/sum(DS(:,1)); %贡献率
    DS(i,3) = sum(DS(1:i,1))/sum(DS(:,1)); %累计贡献率
end

% 选择主成分及对应的特征向量
T = 0.9; %主成分信息保留率
for k = 1:b
    if DS(k,3) >= T
        Com_num = k;
        break;
    end
end
% 提取主成分对应的特征向量
for j = 1:Com_num
    PV(:,j) = V(:,b+1-j);
end

% 计算各评价对象的主成分得分
new_score = SA*PV;
for i = 1:a
    total_score(i,1) = sum(new_score(i,:));
    total_score(i,2) = i;
end
result_report = [new_score,total_score]; %将各主成分得分与总分放在同一个矩阵中
result_report = sortrows(result_report,-4); %按总分降序排序

使用如下数据作为例子:
在这里插入图片描述
结果:
在这里插入图片描述
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 设计师:Steven·简谈 返回首页