PCA(主成分分析)原理详解

article/2025/9/11 1:04:35

PCA概念

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。


协方差和散度矩阵

样本均值:

x ˉ = 1 n ∑ i = 1 N x i \bar{x} = \frac{1}{n}\sum_{i=1}^Nx_i xˉ=n1i=1Nxi

样本方差:

S 2 = 1 n − 1 ∑ i = 1 N ( x i − x ˉ ) 2 S^2 = \frac{1}{n-1}\sum_{i=1}^N(x_i - \bar{x})^2 S2=n11i=1N(xixˉ)2

样本X和样本Y的协方差:

C o v ( x , y ) = 1 n − 1 ∑ i = 1 N ( x i − x ˉ ) ( y i − y ˉ ) Cov(x,y) = \frac{1}{n-1}\sum_{i=1}^N(x_i - \bar{x})(y_i - \bar{y}) Cov(x,y)=n11i=1N(xixˉ)(yiyˉ)

由上面的公式,我们可以得到以下结论:

  1. 方差的计算公式是针对一维特征,即针对同一特征不同样本的取值来进行计算得到;而协方差则必须要求至少满足二维特征;方差是协方差的特殊情况。

  2. 方差和协方差的除数是n-1,这是为了得到方差和协方差的无偏估计。

  • 协方差为正时,说明X和Y是正相关关系:

  • 协方差为负时,说明X和Y是负相关关系;

  • 协方差为0时,说明X和Y是相互独立。

Cov(X,X)就是X的方差。当样本是n维数据时,它们的协方差实际上是协方差矩阵(对称方阵)。例如,对于3维数据(x,y,z),计算它的协方差就是:

散度矩阵定义为:

对于数据X的散度矩阵为 X X T XX^T XXT。其实协方差矩阵和散度矩阵关系密切,散度矩阵 = 协方差矩阵 *(总数据量-1)。因此它们的特征值和特征向量是一样的。这里值得注意的是,散度矩阵是SVD奇异值分解的一步,因此PCA和SVD是有很大联系。


特征值分解矩阵原理

  1. 特征值与特征向量

    如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式:

    A ξ = λ ξ Aξ= λξ Aξ=λξ

    其中,λ是特征向量ξ应的特征值,一个矩阵的一组特征向量是一组正交向量。

  2. 特征值分解矩阵

    对于矩阵A,有一组特征向量ξ,将这组向量进行正交化单位化,就能得到一组正交单位向量。特征值分解,就是将矩阵A分解为如下式:

    A = Q D Q − 1 A = QDQ^{-1} A=QDQ1

    其中,Q是矩阵A的特征向量组成的矩阵,D则是一个对角阵,对角线上的元素就是特征值。


SVD分解矩阵原理

奇异值分解是一个能适用于任意矩阵的一种分解的方法,对于任意矩阵A总是存在一个奇异值分解:

A = U ∑ V T A = U \sum V^T A=UVT

假设A是一个m*n的矩阵,那么得到的U是一个mm的方阵,U里面的正交向量被称为左奇异向量。Σ是一个m\n的矩阵,Σ除了对角线其它元素都为0,对角线上的元素称为奇异值。 V T V^T VT是v的转置矩阵,是一个n*n的矩阵,它里面的正交向量被称为右奇异值向量。而且一般来讲,我们会将Σ上的值按从大到小的顺序排列。

SVD分解矩阵A的步骤:

A A T AA^T AAT的特征值和特征向量,用单位化的特征向量构成 U。

(2) 求 A A T AA^T AAT的特征值和特征向量,用单位化的特征向量构成 V。

(3) 将 A A T AA^T AAT或者 A A T AA^T AAT的特征值求平方根,然后构成 Σ。

具体了解这一部分内容看《机器学习中SVD总结》文章。


PCA算法两种实现方法

基于特征值分解协方差矩阵实现PCA算法

基本步骤

输入:数据集X = { x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3,...,x_n x1,x2,x3,...,xn},需要降到k维

  1. 去平均值(即去中心化),即每一位特征减去各自的平均值。

  2. 计算协方差矩阵 1 n − 1 X X T \frac{1}{n-1} XX^T n11XXT,注:这里除或不除样本数量n或n-1,其实对求出的特征向量没有影响。

  3. 用特征值分解方法求协方差矩阵 1 n − 1 X X T \frac{1}{n-1} XX^T n11XXT的特征值与特征向量。

  4. 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P。

  5. 将数据转换到k个特征向量构建的新空间中,即Y=PX。

这里用 1 n − 1 X X T \frac{1}{n-1} XX^T n11XXT来进行计算,可以求出协方差矩阵,在高纬的情况下,不能仅仅凭借方差来进行计算,就会导致方向几乎重叠,这样的维度是没有用的,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的。因此要增加约束条件,即协方差。协方差为0时,表示两个维度间的特征是相互独立。即使 1 n − 1 X X T \frac{1}{n-1} XX^T n11XXT相似对角化,求出的对应特征值的特征向量组成的矩阵的转置就是我们的P,这是一个正交矩阵。特征值其实代表的就是我们的方差,想降到几维,就选求几个最大的特征值对应的特征向量组成P。为什么选取最大值呢?因为特征值就是对应了我们的方差,方差越大,相应的数据的离散度就高。

👉 更多的请看: PCA的数学原理,强烈推荐!!!

举个栗子

X = { − 1 − 1 0 2 0 − 2 0 0 1 1 } X = \left\{\begin{matrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{matrix} \right\} X={1210002101}

以X为例,我们用PCA方法将这两行数据降到一行。

  1. 因为X矩阵的每行已经是零均值,所以不需要去平均值。

  2. 求协方差矩阵:

    C = 1 5 { − 1 − 1 0 2 0 − 2 0 0 1 1 } { − 1 − 2 − 1 0 0 0 2 1 0 1 } = { 6 5 4 5 4 5 6 5 } C = \frac{1}{5}\left\{\begin{matrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{matrix} \right\} \left\{ \begin{matrix} -1 & -2\\ -1& 0\\ 0& 0\\ 2 & 1\\0 & 1 \end{matrix} \right\} = \left\{ \begin{matrix} \frac{6}{5} & \frac{4}{5} \\ \frac{4}{5} & \frac{6}{5} \end{matrix} \right\} C=51{1210002101}1102020011={56545456}

  3. 求协方差矩阵的特征值与特征向量。

    求解后的特征值为:

    λ 1 = 2 , λ 2 = 2 5 λ_1 = 2 , λ_2 = \frac{2}{5} λ1=2,λ2=52

    对应的特征向量为:

    c 1 = { 1 1 } c 2 = { − 1 1 } c_1 = \left\{ \begin{matrix} 1 \\1 \end{matrix} \right\} c_2 = \left\{ \begin{matrix} -1 \\1 \end{matrix} \right\} c1={11}c2={11}

    其中对应的特征向量分别是一个通解, c 1 c_1 c1 c 2 c_2 c2可以取任意实数。那么标准化后的特征向量为:

    c 1 = { 1 2 1 2 } c 2 = { − 1 2 1 2 } c_1 = \left\{ \begin{matrix} \frac{1}{\sqrt{2}} \\\frac{1}{\sqrt{2}} \end{matrix} \right\} c_2 = \left\{ \begin{matrix} -\frac{1}{\sqrt{2}} \\\frac{1}{\sqrt{2}} \end{matrix} \right\} c1={2 12 1}c2={2 12 1}

  4. 矩阵P为:

    P = { 1 2 1 2 − 1 2 1 2 } P = \left\{ \begin{matrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{matrix} \right\} P={2 12 12 12 1}

  5. 最后我们用P的第一行乘以数据矩阵X,就得到了降维后的表示:

    X = { 1 2 1 2 } { − 1 − 1 0 2 0 − 2 0 0 1 1 } = { − 3 2 − 1 2 0 3 2 − 1 2 } X = \left\{\begin{matrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{matrix} \right\} \left\{\begin{matrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{matrix} \right\} = \left\{\begin{matrix} -\frac{3}{\sqrt{2}} & -\frac{1} {\sqrt{2}} & 0 & \frac{3}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{matrix} \right\} X={2 12 1}{1210002101}={2 32 102 32 1}

  6. 结果如图1所示:

注意:如果我们通过特征值分解协方差矩阵,那么我们只能得到一个方向的PCA降维。这个方向就是对数据矩阵X从行(或列)方向上压缩降维。


基于SVD分解协方差矩阵实现PCA算法

输入:数据集X = { x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3,...,x_n x1,x2,x3,...,xn},需要降到k维

  1. 去平均值(即去中心化),即每一位特征减去各自的平均值。
  2. 计算协方差矩阵。
  3. 通过SVD计算协方差矩阵的特征值与特征向量。
  4. 对特征值从大到小排序,选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
  5. 将数据转换到k个特征向量构建的新空间中。

在PCA降维中,我们需要找到样本协方差矩阵 X X T XX^T XXT的最大k个特征向量,然后用这最大的k个特征向量组成的矩阵来做低维投影降维。可以看出,在这个过程中需要先求出协方差矩阵 X X T XX^T XXT,当样本数多、样本特征数也多的时候,这个计算还是很大的。当我们用到SVD分解协方差矩阵的时候,SVD有两个好处:

  1. 有一些SVD的实现算法可以先不求出协方差矩阵 X X T XX^T XXT也能求出我们的右奇异矩阵V。也就是说,我们的PCA算法可以不用做特征分解而是通过SVD来完成,这个方法在样本量很大的时候很有效。实际上,scikit-learn的PCA算法的背后真正的实现就是用的SVD,而不是特征值分解。

  2. 注意到PCA仅仅使用了我们SVD的左奇异矩阵,没有使用到右奇异值矩阵,那么右奇异值矩阵有什么用呢?假设我们的样本是m*n的矩阵X,如果我们通过SVD找到了矩阵 X X T XX^T XXT最大的k个特征向量组成的k*n的矩阵 V T V^T VT,则我们可以做如下处理:

    X m ∗ k 2 = X m ∗ n V n ∗ k T X^2_{m*k} = X_{m*n}V^T_{n*k} Xmk2=XmnVnkT

    可以得到一个m*k的矩阵X’,这个矩阵和我们原来m*n的矩阵X相比,列数从n减到了k,可见对列数进行了压缩。也就是说,左奇异矩阵可以用于对行数的压缩;右奇异矩阵可以用于对列(即特征维度)的压缩。这就是我们用SVD分解协方差矩阵实现PCA可以得到两个方向的PCA降维(即行和列两个方向)。


PCA的理论推导

PCA有两种通俗易懂的解释:(1)最大方差理论;(2)最小化降维造成的损失。这两个思路都能推导出同样的结果。

我在这里只介绍最大方差理论:

在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。样本在u1上的投影方差较大,在u2上的投影方差较小,那么可认为u2上的投影是由噪声引起的。

因此我们认为,最好的k维特征是将n维样本点转换为k维后,每一维上的样本方差都很大。

比如我们将下图中的5个点投影到某一维上,这里用一条过原点的直线表示(数据已经中心化)

假设我们选择两条不同的直线做投影,那么左右两条中哪个好呢?根据我们之前的方差最大化理论,左边的好,因为投影后的样本点之间方差最大(也可以说是投影的绝对值之和最大)。

计算投影的方法见下图:

图中,红色点表示样例,蓝色点表示在u上的投影,u是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是在u上的投影点,离原点的距离是<x,u>即 X T U X^TU XTU或者 U T X U^TX UTX)。


选择降维后的维度K(主成分的个数)

这里先引入一个概念:PCA误差

PCA的原理是,为了将数据从n维降低到k维,需要找到k个向量,用于投影原始数据,是投影误差(投影距离)最小。

用公式来表示,如下

m表示特征个数

分子表示原始点与投影点之间的距离之和,而误差越小,说明降维后的数据越能完整表示降维前的数据。如果这个误差小于0.01,说明降维后的数据能保留99%的信息。当然这个值可以由我们自己设置,当你觉得误差需要更小,你可以把该值设置的更小。

上式还可以用SVD分解时产生的S矩阵来表示,如下面的式子:

1 − ∑ 1 k S i ∑ 1 m S i ≤ 0.01 1- \frac{\sum_{1}^{k}S_i}{\sum_{1}^{m}S_i} ≤ 0.01 11mSi1kSi0.01

PCA实例

  1. PCA的Python实现:

    ##Python实现PCA
    import numpy as npdef pca(X, k):  # k is the components you want# mean of each featuren_samples, n_features = X.shapemean = np.array([np.mean(X[:, i]) for i in range(n_features)])# normalizationnorm_X = X - mean# scatter matrixscatter_matrix = np.dot(np.transpose(norm_X), norm_X)# Calculate the eigenvectors and eigenvalueseig_val, eig_vec = np.linalg.eig(scatter_matrix)eig_pairs = [(np.abs(eig_val[i]), eig_vec[:, i]) for i in range(n_features)]# sort eig_vec based on eig_val from highest to lowesteig_pairs.sort(reverse=True)# select the top k eig_vecfeature = np.array([ele[1] for ele in eig_pairs[:k]])# get new datadata = np.dot(norm_X, np.transpose(feature))return dataX = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])print(pca(X, 1))
    

    上面代码实现了对数据X进行特征的降维。结果如下:


http://chatgpt.dhexx.cn/article/vxJbU5e7.shtml

相关文章

python主成分分析代码_PCA主成分分析 原理讲解 python代码实现

1. 用途&#xff1a; 通俗来说&#xff1a; 考察一个人的智力情况&#xff0c;就直接看数学成绩就行(存在&#xff1a;数学、语文、英语成绩) 。就是找出一个最主要的特征&#xff0c;然后进行分析。 数据压缩 &#xff08;Data Compression&#xff09; &#xff0c;将高维数…

主成分分析法原理与MATLAB实现

1&#xff1a;主成分分析原理&#xff1a; 主成分分析法是利用降维的思想&#xff0c;把多指标转化为少数几个综合指标&#xff08;即主成分&#xff09;&#xff0c;其中每个主成分都能够反映原始变量的大部分信息&#xff0c;且所含信息互不重复。这种方法在引进多方面变量的…

主成分分析(PCA)原理及应用

在进行统计学分析中往往面临着比较难以抉择的权衡。以农学研究为例&#xff0c;在实验设计时&#xff0c;考虑到研究结论更能反应作物真实状态下的农艺性状&#xff0c;研究人员会尽可能的纳入较多的指标&#xff0c;但是&#xff0c;随着而来的是铺天盖地的数据让人难以下手&a…

PCA主成分分析原理与基础知识

笔记的主要内容是 PCA&#xff08;主成分分析&#xff09; 原理和基本知识&#xff0c;相关数学原理和核心概念。 什么是PCA分析&#xff1f; 主成分分析(PCA, principal component analysis)是一种数学降维方法,利用正交变换把一系列可能线性相关的变量转换为一组线性不相关的…

【机器学习】五、主成分分析原理

主成分分析(Principal Component Analysis)&#xff0c;简称PCA&#xff0c;是机器学习中一种常用来进行数据降维操作的方法。PCA通过矩阵变换&#xff0c;将高维数据变换到低维。本文主要分享PCA的数学原理&#xff0c;帮助大家了解PCA降维的理论基础。码字不易&#xff0c;喜…

主成分分析原理详解

本博客前三节参考https://blog.csdn.net/program_developer/article/details/80632779 至于协方差矩阵的公式推导参考 http://blog.codinglabs.org/articles/pca-tutorial.html 1、背景 在许多领域的研究与应用中&#xff0c;通常需要对含有多个变量的数据进行观测&#xff0…

主成分分析原理及Python实现

主成分分析&#xff08;Principal Components Analysis, PCA&#xff09;是一种常用的数据分析手段&#xff0c;是图像处理过程中常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据&#xff0c;PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据&…

主成分分析原理以及SPSS和Python实现

目录 [ 0 ] 一句话定义[ 1 ] 使用目的和使用条件[ 2 ] 基本思想和直观理解[ 3 ] 具体计算步骤[ 4 ] 求各个成分的累计贡献率[ 5 ] 主成分分析的SPSS和Python实现SPSS实现相关设置结果分析 Python实现 [ 6 ] 总结 [ 0 ] 一句话定义 主成分分析(principal component analysis,PCA…

主成分分析原理

文章目录 一、主成分操作步骤二、spss里面的设置三、一些概念的解释 一、主成分操作步骤 1、为消除量纲的影响&#xff0c;先对数据进行标准化处理&#xff1b; 2、计算相关系数&#xff1a;一般认为各变量之间的相关系数大于0.3较好&#xff1b; 3、KMO检验和Barlett&#…

PCA: Principal Components Analysis,主成分分析法原理

PCA&#xff1a; Principal Components Analysis&#xff0c;主成分分析法原理 1、引入 PCA算法是无监督学习专门用来对高维数据进行降维而设计&#xff0c;通过将高维数据降维后得到的低维数能加快模型的训练速度&#xff0c;并且低维度的特征具有更好的可视化性质。另外&…

【数据处理方法】主成分分析(PCA)原理分析

笔者最近在学习的过程需要使用一些数据分析和处理的方法&#xff0c;而PCA就是其中常用的一种手段。但在自学的过程中&#xff0c;由于笔者水平有限&#xff0c;对一些博客中的公式不是能很好理解&#xff08;数学不好的辛酸Ծ‸Ծ&#xff09;&#xff0c;导致总是对整个方法的…

主成分分析法原理简单理解及技术实现

主成分分析法 主成分分析是利用降维的思想,在损失很少信息的前提下,把多个指标转化为几个综合指标的多元统计方法。通常把转化生成的综合指标称为主成分,其中每个主成分都是原始变量的线性组合,且各个主成分之间互不相关,使得主成分比原始变量具有某些更优越的性能…

win10+tensorflow1.14+cuda10安装踩坑

tensorflow1.14安装记录 需要python3.7&#xff0c;cuda10&#xff0c;cudnn7.6&#xff0c;visual studio 2017 可以用visual studio 2017 community 版本 &#xff0c;win10 sdk要加上&#xff0c;build tools要装上 cuda10.0安装不上报错visual studio integration faile…

Win10 下载torch以及CUDA配置

下载torch以及CUDA配置 下载torch和torchvision安装torch和torchvision安装CUDA检查是否成功 下载torch和torchvision 进入该网站&#xff0c;下载对应的torch和torchvision版本。 https://download.pytorch.org/whl/torch_stable.html以该图为例&#xff0c;cu102代表CUDA10…

Ubuntu 18.10 下安装CUDA10/CUDA10.1

GPU&#xff1a;GeForce840M 显卡驱动&#xff1a;预装&#xff0c;版本390 笔记本 1.降级gcc 使用gcc5 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install gcc-5 g-5 sudo update-alternatives --install /usr/bin/gcc gcc /us…

查看CUDA和cuDNN的版本号 | Win10安装CUDA10和cuDNN

文章目录 &#x1f514; Linux下查看CUDA和cuDNN的版本&#x1f499; Win10安装CUDA10和cuDNN&#xff0c;感谢原作者&#xff0c;链接如下&#x1f680;&#x1f680; 文末专栏推荐部分 &#x1f680;&#x1f680;❤️ 当生成器和判别器趋于平衡&#xff0c;那便是爱情 &…

【NVIDIA】Win10 + CUDA10 + cuDNN 安装教程(转载)

目录 一、前言 二、官方安装教程及软件包 1、官方教程 2、CUDA Toolkit 10.0 Download 3、cuDNN Download 三、Win10安装CUDA10及cuDNN 1、CUDA安装 2、cuDNN配置 3、万事大吉&#xff0c;只欠重启 四、一些后事 问题1&#xff1a;安装过程中电脑自动重启。 问题2&a…

英伟达CUDA 10终于开放下载了

栗子 发自 凹非寺量子位 出品 | 公众号 QbitAI 英伟达的CUDA 10工具包&#xff0c;终于可以下载了。 与9字头的前辈相比&#xff0c;10.0是第一次为图灵GPU定制的版本。 英伟达新近发布的GeForce RTX 20系列和Quadro RTX系列显卡&#xff0c;以及新一代GPU Tesla T4&#xff0c…

win10+cuda10+tensorflow-gpu最新安装教程

win10cuda10tensorflow-gpu最新安装教程 背景简介安装包准备安装过程总结 背景简介 作为刚入门深度学习的小白&#xff0c;新购置了一台机子&#xff0c;准备兴高采烈的开始用GPU跑深度学习算法&#xff0c;百度了一通win10下安装cuda和tensorflow-gpu的教程&#xff0c;十分繁…

30 系列显卡是新一代架构,新驱动不支持 cuda 9 以及 cuda 10,所以必须安装 cuda 11

30 系列显卡是新一代架构&#xff0c;新驱动不支持 cuda 9 以及 cuda 10&#xff0c;所以必须安装 cuda 11 最近在训练一个深度学习模型&#xff0c;要求的环境是python3.7 torch1.3, 而torch1.3支持的cuda版本为9.2或10.2 但是我所用的显卡为3090, 所以网上的解决办法都试遍…