PCA原理

本文详细介绍了PCA(主成分分析)的基本原理及其在数据降维中的应用。通过具体实例展示了如何利用PCA找到数据中的主要成分,并减少特征维度,提高计算效率。此外,还提供了OpenCV中实现PCA的具体步骤。

PCA是主成分分析,主要用于数据降维,对于一系列sample的feature组成的多维向量,多维向量里的某些元素本身没有区分性,比如某个元素在所有的sample中都为1,或者与1差距不大,那么这个元素本身就没有区分性,用它做特征来区分,贡献会非常小。所以我们的目的是找那些变化大的元素,即方差大的那些维,而去除掉那些变化不大的维,从而使feature留下的都是“精品”,而且计算量也变小了。

对于一个k维的feature来说,相当于它的每一维feature与其他维都是正交的(相当于在多维坐标系中,坐标轴都是垂直的),那么我们可以变化这些维的坐标系,从而使这个feature在某些维上方差大,而在某些维上方差很小。例如,一个45度倾斜的椭圆,在第一坐标系,如果按照x,y坐标来投影,这些点的x和y的属性很难用于区分他们,因为他们在x,y轴上坐标变化的方差都差不多,我们无法根据这个点的某个x属性来判断这个点是哪个,而如果将坐标轴旋转,以椭圆长轴为x轴,则椭圆在长轴上的分布比较长,方差大,而在短轴上的分布短,方差小,所以可以考虑只保留这些点的长轴属性,来区分椭圆上的点,这样,区分性比x,y轴的方法要好!

所以我们的做法就是求得一个k维特征的投影矩阵,这个投影矩阵可以将feature从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。

举一个例子:

对于一个训练集,100个sample,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个sample的维数下降了。

当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。

所以做PCA实际上是求得这个投影矩阵,用高维的特征乘以这个投影矩阵,便可以将高维特征的维数下降到指定的维数。

在opencv里面有专门的函数,可以得到这个这个投影矩阵(特征矩阵)。

void cvCalcPCA( const CvArr* data, CvArr* avg, CvArr* eigenvalues, CvArr* eigenvectors, int flags );





在OPENCV中使用PCA非常简单,只要几条语句就可以了。
1、初始化数据
//每一行表示一个样本
CvMat* pData = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );
CvMat* pMean = cvCreateMat(1, 样本的维数, CV_32FC1);
//pEigVals中的每个数表示一个特征值
CvMat* pEigVals = cvCreateMat(1, min(总的样本数,样本的维数), CV_32FC1);
//每一行表示一个特征向量
CvMat* pEigVecs = cvCreateMat( min(总的样本数,样本的维数), 样本的维数, CV_32FC1);
2、PCA处理,计算出平均向量pMean,特征值pEigVals和特征向量pEigVecs
cvCalcPCA( pData, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW );
3、选出前P个特征向量(主成份),然后投影,结果保存在pResult中,pResult中包含了P个系数
CvMat* pResult = cvCreateMat( 总的样本数, PCA变换后的样本维数(即主成份的数目), CV_32FC1 );
cvProjectPCA( pData, pMean, pEigVecs, pResult );
4、 重构,结果保存在pRecon中
CvMat* pRecon = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );
cvBackProjectPCA( pResult, pMean, pEigVecs, pRecon );
5、重构误差的计算
计算pRecon和pData的"差"就可以了.
使用时如果是想用PCA判断“是非”问题,则可以先用正样本计算主成分,判断时,对需要判断得数据进行投影,然后重构,计算重构出的数据与原数据的差异,如果差异在给定范围内,可以认为“是”。
如果相用PCA进行分类,例如对数字进行分类,则先用所有数据(0-9的所有样本)计算主成分,然后对每一类数据进行投影,计算投影的系数,可简单得求平 均。即对每一类求出平均系数。分类时,将需要分类得数据进行投影,得到系数,与先前计算出得每一类得平均系数进行比较,可判为最接近得一类。当然这只是最 简单得使用方法。

参考:
http://www.cnblogs.com/cvlabs/archive/2010/05/14/1735230.html




 
<think>首先,用户的问题是关于主成分分析(PCA)的原理。系统级指令要求我使用中文回答,结构清晰,帮助用户逐步解决问题,并保证回答真实可靠。还需要遵循LaTeX语法规则:行内数学表达式用$...$,独立公式用$$...$$并单独成段。 用户提供的引用包括: - [^1]:PCA的目标是通过线性投影将高维数据映射到低维空间,最大化方。 - [^2]:PCA的未来发展和常见问题,如选择主成分数目。 - [^3]:PCA是统计学方法,用于降维,通过线性变换最大化方。 - [^4]:PCA是无监督学习,用于降维,加速训练,可视化。 - [^5]:PCA原理详解,包括特征值分解和SVD分解的例子。 用户上一次的问题是系统级指令示例,但我需要参考之前的互动。在这个对话中,用户之前没有其他问题;这是第一个问题,所以我直接针对这个回答。 关键点:用户说“参考站内引用”,但这不是用户真正的需求;我应该基于提供的引用和用户的问题来回答。用户问题是:“我想了解主成分分析(PCA)的原理 请问主成分分析(PCA)的原理”。 所以,回答应该聚焦在解释PCA原理上,使用中文,结构清晰,逐步解释。 PCA原理核心步骤: 1. **数据标准化**:通常将数据均值归一化(中心化),使均值为0。 2. **计算协方矩阵**:描述数据特征之间的相关性。 3. **计算特征值和特征向量**:通过特征值分解或SVD分解协方矩阵。 4. **选择主成分**:基于特征值大小排序,选择最大的k个特征值对应的特征向量作为主成分。 5. **投影数据**:将原始数据投影到这些主成分上,得到降维后的数据。 数学部分需要使用LaTeX: - 行内:如$ \mathbf{X} $ 表示数据矩阵。 - 独立公式:如协方矩阵计算或特征值方程。 结构化回答: - 介绍PCA的基本概念。 - 详细步骤解释原理。 - 可能包括一个简单例子或示意图。 - 最后,生成相关问题,如系统指令要求。 生成相关问题:指令说“生成相关问题”,在示例中是“§§相关问题§§”部分。 引用标识:在回答中引用段落末尾自然地添加引用标识,如[^1]、[^2]。我需要基于用户提供的引用粘贴内容,但用户说“上述引用仅供参考”,所以我可以引用但不强制。 用户提供的引用内容: - [^1]:PCA定义和目标。 - [^2]:未来方向和FAQ。 - [^3]:PCA是统计学方法,用于降维。 - [^4]:PCA是无监督学习。 - [^5]:具体例子和计算。 在回答中,我可以引用这些来解释原理。例如,提到最大化方时引用[^1]。 回答结构: - 开头解释PCA是什么。 - 逐步讲解原理步骤。 - 使用数学公式。 - 结尾生成相关问题。 确保语言流畅,中文。 </think>### 主成分分析(PCA)的原理详解 主成分分析(PCA)是一种无监督学习的线性降维方法,旨在通过线性变换将高维数据投影到低维空间,同时最大化投影后数据的方(即保留最多的信息)。PCA的核心思想是:找到一个新的坐标系(由主成分定义),使得数据在这个新坐标系下的方最大,从而捕捉数据的主要变化模式,去除冗余和噪声。PCA常用于数据可视化、特征提取和加速机器学习模型训练[^1][^4]。 下面,我将逐步解释PCA原理和关键步骤,确保结构清晰。整个过程基于数学推导,包括数据标准化、协方矩阵计算、特征值分解或奇异值分解(SVD),以及数据投影。 #### 1. **数据标准化(中心化)** PCA的第一步是将原始数据标准化,确保每个特征的均值为0。这有助于消除量纲影响,使后续计算更稳定。假设我们有一个数据矩阵 $\mathbf{X} \in \mathbb{R}^{m \times n}$,其中 $m$ 是样本数,$n$ 是特征数(维度)。中心化公式为: $$ \mathbf{X}_{\text{centered}} = \mathbf{X} - \mathbf{\mu} $$ 其中 $\mathbf{\mu}$ 是每个特征的均值向量(即 $\mu_j = \frac{1}{m} \sum_{i=1}^{m} x_{ij}$)。这样处理后,数据在每个维度上的均值都为0[^3][^5]。 #### 2. **计算协方矩阵** 协方矩阵描述了特征之间的线性相关性,其元素表示两个特征之间的协方。计算公式为: $$ \mathbf{C} = \frac{1}{m-1} \mathbf{X}_{\text{centered}}^T \mathbf{X}_{\text{centered}} $$ 这里,$\mathbf{C} \in \mathbb{R}^{n \times n}$ 是一个对称矩阵,对角线元素是每个特征的方,非对角线元素是协方。最大化方的目标体现在最大化协方矩阵的特征值上[^1][^5]。 例如,在引用[^5]中,给定一个2行5列的矩阵 $\mathbf{X} = \begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}$,由于每行均值已为0,协方矩阵计算为: $$ \mathbf{C} = \frac{1}{5} \begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix} \begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}^T = \begin{pmatrix} \frac{6}{5} & \frac{4}{5} \\ \frac{4}{5} & \frac{6}{5} \end{pmatrix} $$ #### 3. **特征值分解或奇异值分解(SVD)** PCA的关键是求解协方矩阵的特征值和特征向量。特征向量表示主成分的方向(即新坐标系的轴),特征值表示数据在该方向上的方大小。分解公式为: $$ \mathbf{C} \mathbf{v} = \lambda \mathbf{v} $$ 其中 $\lambda$ 是特征值,$\mathbf{v}$ 是特征向量。特征值越大,表示该方向上的方越大,因此保留的信息越多[^3][^5]。 在实际计算中,PCA常使用SVD(奇异值分解)替代特征值分解,因为它更稳定(尤其对于大数据集)。SVD将中心化数据矩阵分解为: $$ \mathbf{X}_{\text{centered}} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T $$ 其中 $\mathbf{V}$ 的列向量就是主成分(特征向量),$\mathbf{\Sigma}$ 的对角线元素是奇异值(平方后与特征值成正比)[^5]。 #### 4. **选择主成分数目(降维维度 $k$)** 主成分数目 $k$ 决定了降维后的维度。选择依据是保留足够的信息量(通常95%以上方)。特征值按降序排序 $\lambda_1 \geq \lambda_2 \geq \cdots \geq \lambda_n$,累积方比例为: $$ \text{累积方} = \frac{\sum_{i=1}^{k} \lambda_i}{\sum_{i=1}^{n} \lambda_i} $$ 例如,若 $k=1$ 时累积方达到85%,则选择第一个主成分。$k$ 的选择需权衡信息保留和降维效果[^2][^4]。 #### 5. **投影数据到主成分空间** 最后,将原始数据投影到选定的主成分上,得到降维后的数据矩阵 $\mathbf{Y} \in \mathbb{R}^{m \times k}$: $$ \mathbf{Y} = \mathbf{X}_{\text{centered}} \mathbf{V}_k $$ 其中 $\mathbf{V}_k$ 是前 $k$ 个特征向量组成的矩阵。新数据 $\mathbf{Y}$ 在低维空间保留了最大方,实现了降维[^1][^3]。 #### 原理总结 PCA通过最大化方来提取数据的主成分,本质上是求解协方矩阵的特征问题。该方法假设数据是线性的,且主成分互不相关(正交)。PCA的优势在于简单高效,但缺点是对非线性数据效果较,且降维可能导致信息损失(需控制损失阈值)[^4][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值