任务:主成分分析:步骤、应用及代码实现。代码可以用任何你熟悉的编程语言。
“主成分分析”是对于原先提出的所有变量,将重复的变量(关系紧密的变量)删去多余,建立尽可能少的新变量,使得这些新变量是两两不相关的,而且这些新变量在反映课题的信息方面尽可能保持原有的信息。 设法将原来变量重新组合成一组新的互相无关的几个综合变量,同时根据实际需要从中可以取出几个较少的综合变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析(PCA),也是数学上用来降维的一种方法。”
PCA的步骤:
设有m条n维数据
- 将原始数据按列组成n行m列矩阵X。
- 将X的每一行(代表一个属性字段)进行零均质化,即减去这一行的均值。
- 求出协方差矩阵 C = X X T C=XX^T C=XXT。
- 求出协方差矩阵的特征值及对应的特征向量。
- 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P。
- Y = P X Y=PX Y=PX即为降维到k维后的数据。
进行零均质化,就是减去这一行的均值。
协方差矩阵,一般而言,可视作方差和协方差两部分组成,方差构成了对角线上的元素,协方差构成了非对角线上的元素。
方差用来度量单个随机变量的离散程度
协方差用来刻画两个随机变量的相似程度。
方差计算公式: σ x 2 = 1 n − 1 Σ i = 1 n ( x i − x ‾ ) 2 \sigma^{2}_{x}=\frac{1}{n-1}\Sigma^{n}_{i=1}(x_i-\overline{x})^2 σx2=n−11Σi=1n(xi−x)2
其中, n n n表示样本量,符号 x ‾ \overline{x} x表示观测样本的均值。
协方差计算公式: σ ( x , y ) = 1 n − 1 Σ i = 1 n ( x i − x ‾ ) ( y i − y ‾ ) \sigma(x,y)=\frac{1}{n-1}\Sigma^n_{i=1}(x_i-\overline{x})(y_i-\overline{y}) σ(x,y)=n−11Σi=1n(xi−x)(yi−y)
在公式中,符号 x ‾ \overline{x} x, y ‾ \overline{y} y分别表示两个随机变量所对应的观测样本均值。
根据方差的定义,给定 d d d个随机变量 x k x_k xk, k = 1 , 2 , ⋯ , d k=1,2,\cdots,d k=1,2,⋯,d,则这些随机变量的方差为 σ ( x k , x k ) = 1 n − 1 Σ i = 1 n ( x k i − x k ‾ ) 2 , k = 1 , 2 , ⋯ , d \sigma(x_k,x_k)=\frac{1}{n-1}\Sigma_{i=1}^n(x_{ki}-\overline{x_k})^2,k=1,2,\cdots,d σ(xk,xk)=n−11Σi=1n(xki−xk)2,k=1,2,⋯,d
x k i x_{ki} xki表示随机变量 x k x_k xk中的第 i i i个观测样本, n n n表示样本量,每个随机变量所对应的观测样本数量均为 n n n。
根据这些随机变量,我们可以根据协方差的定义,求出两两之间的协方差,即 σ ( x m , x k ) = 1 n − 1 Σ i = 1 n ( x m i − x m ‾ ) ( x k i − x k ‾ ) \sigma(x_m,x_k)=\frac{1}{n-1}\Sigma^n_{i=1}(x_{mi}-\overline{x_m})(x_{ki}-\overline{x_k}) σ(xm,xk)=n−11Σi=1n(xmi−xm)(xki−xk)
因此,协方差矩阵为:
Σ = [ σ ( x 1 , x 1 ) ⋯ σ ( x 1 , x d ) ⋮ ⋱ ⋮ σ ( x d , x 1 ) ⋯ σ ( x d , x d ) ] \Sigma= \begin{bmatrix} \sigma(x_1,x_1)& \cdots& \sigma(x_1,x_d)\\ \vdots&\ddots&\vdots\\ \sigma(x_d,x_1)&\cdots&\sigma(x_d,x_d) \end{bmatrix} Σ=⎣⎢⎡σ(x1,x1)⋮σ(xd,x1)⋯⋱⋯σ(x1,xd)⋮σ(xd,xd)⎦⎥⎤
可知,矩阵 Σ \Sigma Σ为对称矩阵,其大小为 d × d d\times{d} d×d。
特征值和特征向量表达了线性变换的特征。在物理意义上,一个高维空间的线性变换可以想象是在对一个向量在各个方向上进行了不同程度的变换,而特征向量之间是线性无关的,它们对应了最主要的变换方向,同时特征值表达了相应的变换程度。
求特征向量,就是把矩阵A所代表的空间进行正交分解,使得A的向量集合可以表示为每个向量a在各个特征向量上的投影长度。
PCA是一种数据降维算法,它应用的条件是数据/特征之间具有明显的线性相关性。
从数学上理解,它是一种矩阵分解算法。
从物理意义上理解,它是线性空间上的线性变换。
它可以用于数据可视化、数据压缩存储、异常检测、特征匹配与距离计算等。
clear all
%% 5个样本,每个样本2个特征,k=1
x=[-1 -2;
-1 0;
0 0;
2 1;
0 1];
x=x';
k=1;
N=size(x);
col=N(1);
vol=N(2);
%% 零均值化
for i=1:col %每一行
M=mean(x(i,:));
for j=1:vol
x(i,j)=x(i,j)-M;
end
end
%% 计算协方差矩阵
C=cov(x');
%% 计算协方差矩阵的特征值V,特征向量D
[V,D]=eig(C);
%% 将特征向量按降序排序
d=diag(D);
eig1=sort(d,'descend');
v=fliplr(V);
%% 取前k行组成矩阵P
P=v(1:k,:);
%% 得到降维后的数据
Y=P*x
数据压缩(二.2)——主成分分析(PCA)原理