Principal Component Analysis(PCA)

本文介绍了主成分分析(PCA)的基本概念及其实现方法,并通过一个衡量美国329个城市生活质量的实际案例,展示了如何利用MATLAB进行PCA分析,以及如何解读PCA结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

matlab的Feature Transformation提供了一个有关主成分分析的介绍和例子。

 

PCA的介绍

    多元统计分析中普遍存在的困难中,有一个困难是多元数据的可视化。matlab的plot可以显示两个变量之间的关系,plot3和surf可以显示三维的不同。但是当有多于3个变量时,要可视化变量之间的关系就很困难了。

    幸运的是,在一组多变量的数据中,很多变量常常是一起变动的。一个原因是很多变量是同一个驱动影响的的结果。在很多系统中,只有少数几个这样的驱动,但是多余的仪器使我们测量了很多的系统变量。当这种情况发生的时候,你需要处理的就是冗余的信息。而你可以通过用一个简单的新变量代替这组变量来简化此问题。

    主成分分析是一个定量的严格的可以起到简化作用的方法。它产生一组叫做主成分的新变量,每一个主成分是原始变量的线性组合。所有主成分是相互正交的,从而不存在冗余的信息。所有主成分形成了原始数据空间的一组正交基。

    但是有无数种方式来创建一组正交基,那主成分正交基有什么特殊之处呢?

    第一主成分是数据空间的一个轴。当你把各观察值投影到这个轴时,结果会形成一个新变量,这个变量的方差是所有可选的轴中最大的。

    第二主成分是空间的另一个轴,它垂直于第一个轴。投影数据到这个轴上将得到另一组变量,此变量的方差是所有可选的轴中最大的。

    最后得到的所有主成分个数是与原始变量相同的,但是通常前几个主成分方差的和占到了原始数据总方差的80%以上。通过绘制这组新变量,研究者常常会更深入的了解产生原始数据的驱动力。

    在matlab中,可以使用princomp函数来找到主成分,通过使用此函数,你需要用到测量的原始数据。然而,如果你缺少这些数据,但是有这些数据的样本自相关或协方差矩阵,你可以通过使用pcacov函数来做主成分分析。

 

主成分分析的实例

计算成分

    考虑一个例子,它使用了衡量美国329个城市生活质量的9个指标:气候、住房、健康、犯罪率、交通、教育、艺术、娱乐和经济。对于各指标,越高表示越好,如高的犯罪指标表示低的犯罪率。

    先从cities.mat中加载数据

>> load cities

>> whos

Name Size Bytes Class Attributes

categories 9x14 252 char

names 329x43 28294 char

ratings 329x9 23688 double

    cities.mat中包含了3个变量:

categories--一个包含各指标名字的字符串矩阵

names--一个包含329个城市名字的字符串矩阵

ratings--329行9列的数据矩阵

    为快速对ratings数据有个直观的印象,可以使用盒图绘制出数据来

boxplot(ratings,'orientation','horizontal','labels',categories)

42690282

    可以注意到大体上艺术和住房的指标要比犯罪和气候的指标有更大的变异性。

    通常你会考虑绘制各对原始变量,但这将有36对变量图。而主成分分析或许会降低你需要考虑的变量个数。

有时对原始数据计算主成分是可以的,这在各变量是相同的单位时是很合适的。但是当变量单位不同或不同列数据的方差相差很大时,先对数据做标准化是更好的。

    可以通过除以各列标准差来标准化数据,如下

stdr = std(ratings);

sr = ratings./repmat(stdr,329,1);

    这样就为找主成分做好准备了。

 

[coefs,scores,variances,t2] = princomp(sr);

    下面各部分解释了princomp函数的输出。

Component Coeffcients

    coefs包含了产生主成分的原始变量线性组合的系数,它常被称为loadings。它是9X9的矩阵,前三个主成分的系数向量为

>> c3 = coefs(:,1:3)

c3 =

0.2064 -0.2178 0.6900

0.3565 -0.2506 0.2082

0.4602 0.2995 0.0073

0.2813 -0.3553 -0.1851

0.3512 0.1796 -0.1464

0.2753 0.4834 -0.2297

0.4631 0.1948 0.0265

0.3279 -0.3845 0.0509

0.1354 -0.4713 -0.6073

    可以看到在第一主成分中最大的系数是第三个和第七个,即健康和艺术。此主成分的所有系数都是正的。

    主成分通常是单位长且正交的

I = c3'*c3

I =

1.0000 -0.0000 -0.0000

-0.0000 1.0000 -0.0000

-0.0000 -0.0000 1.0000

 

Component Scores

    scores包含了原始数据在被主成分定义的新坐标系统中的坐标,它是和原始数据矩阵同大小的。

    绘制scores的前两列可以展示原始数据投影到前两个主成分的新数据。princomp函数计算的scores具有零均值。

plot(scores(:,1),scores(:,2),'+')

xlabel('1st Principal Component')

ylabel('2nd Principal Component')

4666816

    注意到上图中右边的离群点。函数gname可以用于标出这些离群点,调用gname时传入一个string矩阵,它包含了各点的标签,如下

gname(names)

    移动鼠标在右半部分的点点击,当你点击各点的时候,在点上会标记names中对应的字符串,如下

5122292

    从上面的标记,发现这些离散点是美国一些人口比较多的城市,它们明显与其他数据不同,所以它们可能需要被分离开。为移除这些数据,首先识别这些数据的行,方法如下

1.关闭上面的figure

2.重绘plot

plot(scores(:,1),scores(:,2),'+')

xlabel('1st Principal Component');

ylabel('2nd Principal Component');

3.运行gname函数,如输入参数

4.标记离散点,标记自动为这些数据的行数

5860676

    然后创建一个包含这些点的变量

metro = [43 65 179 213 234 270 314];

names(metro,:)

ans =

Boston, MA

Chicago, IL

Los Angeles, Long Beach, CA

New York, NY

Philadelphia, PA-NJ

San Francisco, CA

Washington, DC-MD-VA

    然后移除这些行

rsubset = ratings;

nsubset = names;

nsubset(metro,:) = [];

rsubset(metro,:) = [];

size(rsubset)

ans =

322 9

 

Component Variances

    variances是一个包含了主成分方差的向量,scores的每一列的方差即为variances对应的项

variances

variances =

3.4083

1.2140

1.1415

0.9209

0.7533

0.6306

0.4930

0.3180

0.1204

    你可以很容易的计算所有差异性占到百分比

percent_explained = 100*variances/sum(variances)

percent_explained =

37.8699

13.4886

12.6831

10.2324

8.3698

7.0062

5.4783

3.5338

1.3378

    使用pareto函数可以以图的方式显示此百分比

pareto(percent_explained)

xlabel('Principal Component')

ylabel('Variance Explained (%)')

6529640

    显示的figure中可以看到第一主成分明显比第二主成分要高很多,但它只解释了不到40%的方差,所以需要使用更多的成分。可以看到前三个主成分解释了三分之二的方差,所以这三个成分可以作为一个理想的方式来降低维数。

 

Hotelling's T2

    t2是一个衡量各观测值离数据中心距离的统计量,这是一个找出数据中极值点的有效分析方法。

[st2, index] = sort(t2,'descend'); % Sort in descending order.

extreme = index(1)

extreme =

213

names(extreme,:)

ans =

New York, NY

    这个极值点是不奇怪的,因为Vew York的ratings是离美国城镇平均值是最远的。

 

结果可视化

    使用biplot函数可以帮助我们可视化各变量的主成分的系数和各观察值的主成分scores。如下,

biplot(coefs(:,1:2), 'scores',scores(:,1:2),...

'varlabels',categories);

axis([-.26 1 -.51 .51]);

7520979

    上图中,9个变量以向量的形式呈现出来,向量的方向和长度表示了各变量对两个主成分的贡献。例如,对于第一主成分,对所有9个变量的系数都是正值。对于第二主成分,变量教育、健康、艺术和交通是正的贡献,其他5个是负的贡献。这表明此成分在不同城市间是有区别的:大的值的变量、小的值的变量和负值的变量。

    上图中变量标签有时候会很拥挤,可以在绘图时在varlabels参数中忽略一些,或在figure的编辑模式下选中并移动它们。可以使用Tools下的Data Cursors功能查看图中的信息

8587028

    biplot函数也可以用于绘制三维的信息

biplot(coefs(:,1:3), 'scores',scores(:,1:3),...

'obslabels',names);

axis([-.26 1 -.51 .51 -.61 .81]);

view([30 40]);

8673062

<think>好的,我现在需要回答用户关于主成分分析(PCA)的概念、实现方法和应用场景的问题。首先,我得回顾一下自己了解的PCA知识,同时结合用户提供的引用内容,确保回答准确且符合要求。 用户提供的引用中有几个关键点需要注意。引用[1]提到PCA是数据降维的方法之一,引用[3]和[4]详细解释了PCA的原理,包括其作为非监督学习的方法,通过特征值分解进行数据压缩和去噪,以及主成分是原始数据的线性组合。引用[5]给出了一个使用scikit-learn实现PCA的代码示例。此外,引用[3]还提到了PCA的变种,如KPCA、增量PCA和稀疏PCA,这些可能在回答优化或应用部分有用。 首先,我需要明确用户的问题分为三个部分:概念、实现方法和应用场景。结构上应该分点回答,每个部分清晰。同时,根据系统级指令,行内数学公式需要用$...$,独立公式用$$...$$,并且正确使用LaTeX语法。还要生成相关问题,并在引用处添加标识。 概念部分,需要解释PCA的基本原理。根据引用[4],PCA是一种线性变换技术,用于降维并保留大部分信息。主成分是正交变换后的新坐标轴,是原始变量的线性组合。这里可能需要提到方差最大化,即PCA找到数据方差最大的方向作为第一主成分,后续成分与前面的正交且方差次大。需要数学表达式,比如协方差矩阵、特征值分解等。例如,协方差矩阵的计算公式,特征值和特征向量的作用。 实现方法部分,引用[5]中的代码示例是一个很好的起点。需要分步骤说明PCA的实现过程,包括数据标准化、计算协方差矩阵、特征分解、选择主成分、投影数据等步骤。同时,可以提到使用scikit-learn的PCA类简化流程。这里需要确保代码块正确,并解释关键参数如n_components。 应用场景部分,根据引用[1]、[3]、[4],PCA常用于数据压缩、可视化、去噪、特征提取等。比如在图像处理、金融数据分析、生物信息学等领域。需要具体例子,如人脸识别中的降维,或基因组数据中的特征提取。同时,引用[3]提到的变种应用场景,如KPCA处理非线性数据,可以补充说明。 在写作过程中,要检查数学公式的正确性。例如,协方差矩阵的公式是否正确,特征值分解的表示是否准确。例如,协方差矩阵的计算应该是$\frac{1}{n-1}X^TX$,其中$X$是标准化后的数据矩阵。特征分解部分,协方差矩阵分解为$W\Lambda W^T$,其中$W$是特征向量矩阵,$\Lambda$是特征值对角矩阵。 此外,需要确保每个引用标识正确对应到用户提供的引用内容。例如,提到PCA作为非监督学习的方法时引用[3],提到主成分是线性组合时引用[4],代码示例引用[5]。 生成相关问题部分,需要考虑用户可能进一步想知道的内容,比如PCA的优缺点、与其他降维方法的比较、参数选择的影响、数学推导细节等。例如,如何选择主成分的数量,PCA与LDA的区别,PCA的假设是否限制其应用等。 最后,要确保回答结构清晰,分点明确,语言通顺,符合中文习惯。同时,行内公式正确使用$符号,独立公式单独成段,并正确使用LaTeX语法,例如协方差矩阵、投影公式等。</think>### 主成分分析(PCA)详解 #### 一、概念与数学原理 主成分分析(PCA)是一种**非监督学习的线性降维方法**,核心是通过正交变换将高维数据映射到低维空间,同时保留最大方差信息[^3]。其数学原理包含以下关键步骤: 1. **数据标准化**:将原始数据去中心化(均值为0),公式为: $$X_{\text{norm}} = X - \mu \quad (\mu \text{为均值向量})$$ 2. **协方差矩阵计算**:标准化后的数据计算协方差矩阵: $$C = \frac{1}{n-1}X_{\text{norm}}^T X_{\text{norm}}$$ 3. **特征值分解**:对协方差矩阵$C$进行特征分解,得到特征值$\lambda_i$和对应特征向量$W$: $$C = W \Lambda W^T \quad (\Lambda \text{为特征值对角矩阵})$$ 4. **主成分选择**:按特征值从大到小排序,选取前$k$个特征向量构成投影矩阵$W_k$,将原始数据投影到低维空间: $$Z = X_{\text{norm}} W_k$$ 每个主成分对应一个特征向量,其重要性由特征值$\lambda_i$衡量,方差贡献率为$\lambda_i / \sum \lambda_i$[^4]。 --- #### 二、实现方法(Python示例) 使用`scikit-learn`实现PCA的完整流程: ```python from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # 数据标准化(PCA前必须) scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 初始化PCA并降维 pca = PCA(n_components=2) # 指定保留2个主成分 X_pca = pca.fit_transform(X_scaled) # 查看方差贡献率 print("方差贡献率:", pca.explained_variance_ratio_) ``` **关键参数说明**: - `n_components`:可设为整数(目标维度)或小数(保留方差的百分比,如0.95) - `svd_solver`:优化算法选择(如`auto`, `full`, `randomized`) --- #### 三、应用场景 1. **数据可视化**:将高维数据降至2D/3D,便于绘制散点图观察分布。 2. **特征压缩**:减少图像、语音等数据的存储和计算成本[^4]。 3. **去噪与预处理**:通过保留主成分过滤噪声,提升模型鲁棒性。 4. **多变量分析**:在金融领域分析股票收益率的关联性,或在生物信息学中处理基因表达数据[^1][^4]。 **案例**: 在人脸识别中,PCA可将数万像素的图片降至几十个主成分(特征脸),显著提升分类效率。 --- #### 四、优化与限制 - **优化方法**: - **核PCA(KPCA)**:通过核函数处理非线性数据。 - **增量PCA**:适用于内存不足的大数据集[^3]。 - **局限性**: - 主成分的可解释性较弱(线性组合可能缺乏物理意义)。 - 对异常值敏感,需提前标准化处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值