主成分分析法PCA介绍及其基本原理

PCA的主要目的:降维

在许多领域的研究学习中,往往需要同时是处理大批量的数据以进行研究。这些数据的处理是有很多维的,处理起来非常困难,即使交给计算机也需要很复杂的算法。如果不同变量之间有复杂的相关性,算法则会更加复杂,难以处理。显然也不能单独对各个变量进行分析。这种情况下,需要另辟蹊径。
这里需要一种方法,可以在减少运算复杂性的同时尽量最最小化损失的信息量,也就是PCA了。
所谓减少运算复杂性,也就是降维,我们举个例子加以说明:

假设有这么一组数据:一组视频的点击量,时间长度,收藏量,每分钟同时观看人数,打赏金额,评论数等。如果综合分析这一组数据,这是个高维问题,很难。但我们可以根据变量之间的相关性对其进行一定程度降维。
比如:点击量和每分钟同时观看人数是成正相关的,这两个向量可以降维成一个向量,且数据不会有太多损失。
当N维降维到K维,即N个特征降到K个。我们就称降维后得到的数据为“主成分”。

降维的基本原理

我们首先要有基变换的概念,我们在二维坐标系内讨论:
首先假设有这么一组二维数据,可以在二维坐标系内表示。
在这里插入图片描述
同时有这么一组基:
在这里插入图片描述
要描述一组向量,首先要确定一组基,用向量在基上的投影描述向量
要得到数据在基上的投影,计算向量内积即可
在这里插入图片描述

显然一组数据可以用向量来表示,这里我们将一维数据用一维列向量a表示,一个变量的数据则是一组行向量
那么M个N维向量,则可以表示为一个N*M矩阵:(a1 a2 a3 … aM)
要将其降维,我们要用足够的正交单位基乘上该矩阵:
在这里插入图片描述
pi表示第i个基,是行向量
由此可见,变换的关键是找到适合的变换基,即变换矩阵P,而PCA的实质即数据的旋转
基的选择:必须是线性无关的,一般方便起见选择正交的单位基

PCA的具体方法

具体的降维主要要利用到协方差矩阵的相关计算,在此用一实例说明:
以网上的一组三维数据为例(8位学生的身高,胸围,体重):
在这里插入图片描述
第一步:首先将数据进行预处理,各维(行)数据减去该维(行)的平均值,使其成为零均值,得到:

在这里插入图片描述
第二步:计算样本均方差矩阵Cov,可用cov()函数快速实现,得到:
在这里插入图片描述
第三步:计算协方差矩阵的特征值和特征向量,具体方法为利用 |λE - A| = 0,将得到的特征值与相应的特征向量按特征值从大到小排列:
在这里插入图片描述
由此可得各主成分的表达式:
在这里插入图片描述
第四步:此处我们选择将其降为二维,则选取前两列的特征向量为矩阵P与处理过后的样本值相乘(内积),最后得到的就是我们需要的降维后数据在二维坐标系里的坐标。
在这里插入图片描述
在这里插入图片描述
根据资料,第一个主成分表示学生的身材大小(横坐标),第二个表示学生体形特征(纵坐标)。
在这里插入图片描述
具体实现上述例子的代码如下:

clear;
clc;
k = 2;           %降到2维
A = [149.5 162.5 162.7 162.2 156.5 156.1 172 173.2;
    69.5 77 78.5 87.5 74.5 74.5 76.5 81.5;
    38.5 55.5 50.8 65.5 49 45.5 51 59.5]'
[rows cols] = size(A)
covA = cov(A)                          %求样本的协方差矩阵(散步矩阵除以(n-1)即为协方差矩阵)
[vec val] = eigs(covA)                     %协方差矩阵的特征值D和特征向量V
meanA = mean(A)                        %样本均值mean
tempA = repmat(meanA,Row,1);           %一个由各组均值组成的矩阵,用于得到零均值矩阵
SCORE2 = (A - tempA)*vec                %降到2维后得到的的主成分
pcaData2 = SCORE2(:,1:k)               %取前两组数据
figure(1);
scatter(pcaData2(:,1),pcaData2(:,2));grid on;

更高维的降维也可按照此步骤来

补充

为何在此处选择降到二维?这与贡献率有关。样本的贡献率由其协方差矩阵的特征值来计算,三个主成分的方差贡献率分别为:

在这里插入图片描述
由此可见前两项主成分的总贡献率为98.7%。几乎为100%。忽略第三个主成分对信息的损失很小,所以可以直接去前两个主成分进行分析。(一般贡献率大于85%时可以考虑)
PCA也有许多扩展,如KPCA(Kernel PCA,核PCA)、MPCA(Multilinear PCA,多线性PCA)等变形,可以有效弥补标准PCA算法存在的某种缺陷。

PCA的应用

PCA有许多应用,数据压缩,数据可视化,聚类分析等。。

图像压缩

举个例子,PCA算法可有效应用于图像的压缩,这与我们的课程知识紧密相关。
简单来说,对图像的压缩即,将一幅NM的图像X经过变换矩阵P降维变为KM的图像Y,借此减少数据量,实现数据压缩。而且根据压缩后的K*M的图像Y和变换矩阵P可以成功获取原图像X。
由于图像像素点较多,一般将图像分割为一个个小块分别进行PCA降维。


实例代码如下:
clear;
clc;
In = imread(‘C:\Users\10935\Desktop\timg.jpg’); %读取图片

k = 1; %取前k个特征值
size_block = 3; %取size_block*size_block块

In = im2double(In); %% 将原图像矩阵分割成nn的块,再转化为列矩阵,构成最终矩阵reIn
[rows, cols] = size(In);
m = 0;
Data = zeros(size_block
size_block,(rows/size_block)*(cols/size_block)); % 数据矩阵
for i = 1:size_block:rows
for j = 1:size_block:cols
m = m+1;
block = In(i:i+size_block-1,j:j+size_block-1);
Data(:,m) = block(😃;
end
end

Data1 = Data - ones(size(Data,1),1)*mean(Data); % 标准化处理
c = cov(Data1’); % 求矩阵协方差矩阵
[vec,val] = eig©; % 求特征值和特征向量,特征值由大到小排列
val = diag(val); % 从对角线拿出特征值
[val, t] = sort(val,‘descend’); % 特征值降序排列
vec = vec(:,t); % 特征向量也对应改变顺序
vec_new = vec(:,1:k); % 取前k个特征向量

rata = val./sum(val);
rata_sum = sum(rata(1:k));
fprintf(‘选取%g个特征值的贡献率为:%g’,k,rata_sum); %计算当前特征数的贡献率

y = vec_new’* Data; % y=w’x,求原图像
Data2 = vec_new * y; % 重构图像
Data2 = Data2 + ones(size(vec_new, 1), 1) * mean(Data); % 加上均值,还原数据
m = 0;
for i = 1:size_block:rows
for j = 1:size_block:cols
m = m + 1;
block1 = reshape(Data2(:, m), size_block, size_block); % 列向量块转化为方块
Out(i:i+size_block-1, j:j+size_block-1) = block1;
end
end
imshow(In),title(‘原图’)
figure,imshow(Out),title(‘压缩后’)
imwrite(Out,‘压缩后.jpg’)
代码由https://blog.csdn.net/sinat_38486449/article/details/79766234此处代码修改而得
原图为780
462
在这里插入图片描述
选取k=1后,实现的效果为:
在这里插入图片描述
图像变得比较模糊,说明丢失了较多信息,细节部分不能很好还原,且贡献率仅为41.73%。一个特征无法很好的表示图片。接下来使k=4
在这里插入图片描述
此时的贡献率为93.37%,可以比较好的展现图,仅仅在一些细节方面有信息的丢失,总体视觉上与原图没有什么差别。
压缩的一个重要指标是压缩比:
在这里插入图片描述
m为分割后子图的数量,n为子图向量的长度。此例中m=40040,n=9,k=4,压缩比为44.45%,相当于数据量减少一半而信息几乎不丢失。
此外,当无法整数分割子图时,可以考虑再外围加上白边。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值