利用PCA,SVD原理实现对图片的特征提取(矩阵降维)

简述SVD和PCA

PCA

PCA是通过计算原始数据的协方差矩阵来将原始的数据构造成方阵;随后选择其中贡献率(方差、熵、特征值)较大,以此来提取一个矩阵的主要特征,并以此来实现降维;

SVD

SVD是通过将构造原始数据 A A A,通过 A T ⋅ A A^T·A ATA来构造方阵;
随后在其中选择贡献率(方差、熵、奇异值)较大的变量来对原矩阵进行分解,以此来提取数据矩阵的主要特征;

区别

  1. 将实际数据转换为方阵的方式不同;PCA是利用去中心化后的原始数据的协方差矩阵来将原始的数据构造成方阵;SVD是通过将构造原始数据 A A A,通过 A T ⋅ A A^T·A ATA来构造方阵;
  2. 通常情况下SVD的奇异值下降的很快,很多时候10%或者1%就能占全部奇异值的99%以上,既也就是SVD有更好的降维效果;
  3. 由于 1 n ⋅ X T ⋅ X = 1 n U S V T V S U T = U S 2 n U T . \cfrac{1}{n} \cdot X^T·X = \cfrac{1}{n}USV^T VSU^T =U \cfrac{S^2}{n} U^T . n1XTX=n1USVTVSUT=UnS2UT.故SVD可以获取另一个方向上的主成分,而PCA只获取单方向上的主成分;
  4. 通常SVD比PCA更加稳定;因为在计算 X T X X^T X XTX时部分过小的数据会因为计算而丢失,从而使结果相比PCA更加稳定;

具体实现步骤(算法简述)

PCA

  1. 对原始数据进行去中心化,即: V = ( x 11 − u 1 ⋅ ⋅ ⋅ x n 1 − u n ⋮ ⋱ ⋮ x m 1 − u 1 ⋅ ⋅ ⋅ x m n − u n ) , 其 中 u i = 1 m ∑ 1 ≤ j ≤ m x i j V = \begin{pmatrix} x_{11}-u_{1} & \cdot\cdot\cdot &x_{n1}-u_{n} \\ \vdots & \ddots & \vdots\\ x_{m1}-u_{1} & \cdot\cdot\cdot &x_{mn}-u_{n} \end{pmatrix} ,其中 u_i = \cfrac{1}{m}\sum_{\mathclap{1\le j\le m}} x_{ij} V=x11u1xm1u1xn1unxmnun,ui=m11jmxij

  2. 计算样本的协方差矩阵:
    C = ( c o v ( x 1 , x 1 ) ⋅ ⋅ ⋅ c o v ( x 1 , x n ) ⋮ ⋱ ⋮ c o v ( x n , x 1 ) ⋅ ⋅ ⋅ c o v ( x n , x n ) ) C = \begin{pmatrix} cov(x_1,x_1)& \cdot\cdot\cdot &cov(x_1,x_n) \\ \vdots & \ddots & \vdots\\ cov(x_n,x_1) & \cdot\cdot\cdot &cov(x_n,x_n) \end{pmatrix} C=cov(x1,x1)cov(xn,x1)cov(x1,xn)cov(xn,xn)
    简 易 公 式 : C = 1 m ⋅ X T ⋅ X 简易公式:C = \cfrac{1}{m} \cdot X^T·X C=m1XTX

  3. 计算新矩阵C的特征值和特征向量,并对其从大到小进行排序;

  4. 选取其中较大的t个特征值对应的特征向量构造新的矩阵:
    V = ( c 11 ⋅ ⋅ ⋅ c 1 t ⋮ ⋱ ⋮ c m 1 ⋅ ⋅ ⋅ c m t ) V = \begin{pmatrix} c_{11} & \cdot\cdot\cdot &c_{1t} \\ \vdots & \ddots & \vdots\\ c_{m1} & \cdot\cdot\cdot &c_{mt} \end{pmatrix} V=c11cm1c1tcmt

  5. 将数据投放到新的数据空间中: L = X ⋅ V L=X·V L=XV

  6. 可以将降维后的数据还原,以此来检测损失率: D = L ⋅ V T + U D=L·V^T+U D=LVT+U

SVD

  1. 将原始数据转化为方阵: D = X ⋅ X T D=X·X^T D=XXT

  2. 计算新矩阵 D D D的特征值和特征向量,并对其从大到小进行排序得到特征值对角阵 E E E和特征向量阵;

  3. 选取其中较大的t个特征值对应的特征向量构造矩阵 V V V特征值构成对角阵 S S S
    V = ( d 11 ⋅ ⋅ ⋅ d 1 t ⋮ ⋱ ⋮ d m 1 ⋅ ⋅ ⋅ d m t ) V = \begin{pmatrix} d_{11} & \cdot\cdot\cdot &d_{1t} \\ \vdots & \ddots & \vdots\\ d_{m1} & \cdot\cdot\cdot &d_{mt} \end{pmatrix} V=d11dm1d1tdmt
    S = ( e 11 ⋅ ⋅ ⋅ 0 ⋮ ⋱ ⋮ 0 ⋅ ⋅ ⋅ e m t ) S = \begin{pmatrix} e_{11} & \cdot\cdot\cdot &0 \\ \vdots & \ddots & \vdots\\ 0 & \cdot\cdot\cdot &e_{mt} \end{pmatrix} S=e1100emt

  4. 逆向推导,利用 D = U ⋅ S ⋅ V T D=U·S·V^T D=USVT推导出: U = D ⋅ V ⋅ S − 1 U=D·V·S^{-1} U=DVS1

  5. 可以将降维后的数据还原,以此来检测损失率: N = U ⋅ S ⋅ V − 1 N=U·S·V^{-1} N=USV1

程序源码:

以matlab语言为例实现对图片的降维存储

注意: 该程序中是直接选择保留90%的特征,实际情况可以根据需要调整;

clear
clc
disp('利用svd和pca对图像进行降维存储')
disp('原始数据为1080*1920')

%对原始数据进行预处理
data = imread('Example.jpeg');
subplot(2,2,1)
imshow(data)
title('原始图像')
%图像灰度化
data =rgb2gray(data);
data = im2double(data);
%原始图像展示
subplot(2,2,2)
imshow(data)
title('原始图像灰度图')

%=========================================================================
%进行svd分解
[V,D] = eig(data'*data);
[S,D_index] = sort(diag(sqrt(D)),'descend');
S = diag(S);
V=V(:, D_index);
U = data * V * S^-1;
%获得对应的usv

cul = 0;
S_sum = sum(sum(S));
for i = 1:length(S)
    cul = cul + S(i,i)/S_sum;
    if cul > 0.9
        break
    end
end
disp(['提取累积贡献率大于90%的奇异值的个数为   ' num2str(i)])

%展示结果
V = V';
%生成新的数据
majorData = U(:,1:i) * S(1:i,1:i) * V(1:i,:);
subplot(2,2,3)
imshow(majorData)
title('svd提取主要特征之后的图像')

%=========================================================================
%进行PCA分解
d_mean = mean(data);
d_mean(length(data(:,1)),length(d_mean)) = 0;
for j = 1:length(d_mean)
    d_mean(:,j) = d_mean(1,j);  
end
data_mean = data-d_mean;
temp = cov(data_mean);
[V,D] = eig(temp);
[S,D_index] = sort(diag(sqrt(D)),'descend');
S = diag(S);
V=V(:, D_index);


cul = 0;
S_sum = sum(sum(S));
for i = 1:length(S)
    cul = cul + S(i,i)/S_sum;
    if cul > 0.9
        break
    end
end
disp(['提取累积贡献率大于90%的奇异值的个数为   ' num2str(i)])
V = V(:,1:i);
%展示结果
finData =data_mean * V;
%生成新的数据
majorData = finData*V'+ d_mean;
subplot(2,2,4)
imshow(majorData)
title('PCA提取主要特征之后的图像')

运行结果

原图片截图

在这里插入图片描述

命令行输出

命令行结果

图片处理结果

图片处理结果

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 是的,主成分分析(PCA)可以转化为特征值分解问题。PCA是一种线性降维技术,它可以将高维数据转化为低维数据,同时保留原始数据的主要特征PCA的核心是对数据进行协方差矩阵分解,得到其特征向量和特征值,然后根据特征值大小选择前k个特征向量,将原始数据投影到这k个特征向量所张成的低维空间中,即得到降维后的数据。因此,PCA可以看作是一个特征值分解的过程。 ### 回答2: PCA(Principal Component Analysis,主成分分析)可以使用特征值分解的方法进行求解。特征值分解是一种常见的矩阵分解方法,可以将一个方阵分解为特征值和特征向量的乘积。 在PCA中,我们首先需要计算数据集的协方差矩阵。协方差矩阵是一个对称矩阵,对角线上的元素是各个特征的方差,非对角线上的元素是各个特征之间的协方差。 接下来,我们可以使用特征值分解的方法,将协方差矩阵分解为特征值和特征向量的乘积。特征值代表着每个特征轴上的方差,而特征向量则代表着数据在该特征轴上的投影方向。 PCA的目标是选择出方差最大的特征轴,也就是特征值最大的特征向量。选择前k个最大的特征向量,就可以构建出一个k维的子空间,将数据映射到该子空间中。 因此,可以说PCA的求解过程可以转化为特征值分解问题,通过求解协方差矩阵特征值和特征向量,我们可以得到数据集的主成分(principal component),也就是方差最大的特征轴。这样就可以实现数据的降维提取主要特征的目标。 ### 回答3: PCA(主成分分析)是一种常用的降维技术,它通过线性变换将高维数据映射到低维空间以保留最大的方差。而特征值分解是一种常用的矩阵分解方法,用于求解矩阵特征值和特征向量。 实际上,PCA可以转化为特征值分解问题。设给定的数据矩阵为X,它的协方差矩阵为C。首先,我们计算C的特征向量和特征值,然后选择其中最大的k个特征值对应的特征向量,作为投影矩阵P。最后,将数据矩阵X与投影矩阵P相乘,即可得到降维后的数据矩阵Y。 具体而言,设特征向量矩阵为U,特征矩阵为Λ,则PCA特征值分解问题可以表述为: C = U * Λ * U^T 其中,U的列向量就是C的特征向量,Λ的对角线元素就是C的特征值。将U的前k列组成投影矩阵P,即: P = [u1, u2, ..., uk] 则投影后的数据矩阵Y可以表示为: Y = X * P 因此,PCA的求解可以等价地视作特征值分解问题。 但需要注意的是,当数据量非常大时,直接进行特征值分解计算的复杂度可能较高。为了解决这个问题,常常使用基于奇异值分解(SVD)的方法来实现PCASVD可以更高效地计算主成分,从而加速PCA的求解过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值