多媒体数据处理实验2:PCA

第2次实验:主成分分析PCA

1. 算法描述

功能:

 利用PCA算法可以对给定的数据集进行降维操作,使得处理后的数据不仅维数较低、能保存绝大部分信息,而且各维之间的相关性也为0(没有冗余信息,正交)。

2. PCA的数学原理

(1) PCA的目的

  一般而言,一个未经处理的数据集可能存在两个问题,一个是维数太高,另一个是各维度特征之间存在着相关性,从而导致各维存储的信息之间存在冗余。由于这两个问题的存在,给人们压缩、存储、处理相关数据带来了一定的困难。因此,我们需要找到一种能够对数据进行降维处理的同时还能保留大部分信息的算法去对原始数据进行处理,使得处理后的数据不仅维数较低、能保存绝大部分信息,而且各维之间的相关性也为0(没有冗余信息,正交)。

(2) 方差、协方差的意义

  方差越大,说明数据越分散。我们通常认为,在某个特征维度上数据越分散,该特征越重要。

  协方差用来刻画两个随机变量之间的相关性,反映的是变量之间的二阶统计特性。相关系数和协方差在描述相关性(线性相关)方面是等价的,而独立与相关的关系是:独立一定不相关,不相关不一定独立(因为可能存在非线性关系)。在实际应用中,协方差可以用来刻画两个特征维度之间的相关性。

(3) PCA的核心思想

  设原数据集矩阵 X n × m X_{n×m} Xn×m对应的协方差矩阵为 C n × n C_{n×n} Cn×n,而 P k × n P_{k×n} Pk×n是一组基沿行方向排列构成的矩阵(线性变换矩阵),设变换后的数据为 Y k × m = P X Y_{k×m}=PX Yk×m=PX。设 Y Y Y的协方差矩阵为 D k × k D_{k×k} Dk×k,则 D D D C C C的关系推导如下:
D = 1 m Y Y T = 1 m ( P X ) ( P X ) T = 1 m ( P X X T P T ) = P ( 1 m X X T ) P T = P C P T D=\frac{1}{m}YY^T=\frac{1}{m}(PX)(PX)^T=\frac{1}{m}(PXX^TP^T)=P(\frac{1}{m}XX^T)P^T=PCP^T D=m1YYT=m1(PX)(PX)T=m1(PXXTPT)=P(m1XXT)PT=PCPT
  那么现在问题等价为求一个线性变换矩阵 P P P,使得 P C P T PCP^T PCPT为对角阵,且对角元素从上到下依次递减。

  考虑到协方差矩阵 c c c是一个实对称矩阵,因此它具有一些良好的数学性质:

  (a) 实对称矩阵不同特征值对应的特征向量必然正交;

  (b) 设 e 1 , . . . , e n e_1, ..., e_n e1,...,en C C C n n n个特征向量,设 E E E为这 n n n个特征向量按行排列构成的矩阵,则必有 E C E T = Λ ECE^T=\Lambda ECET=Λ

  因此,为了将 X X X降至 k k k维且让 D D D的对角元素值从第一行向下递减,我们只需要将 C C C的前 k k k个最大的特征值对应的特征向量构成正交变换矩阵 P P P即可实现目标。

3. 算法流程

  (1) 将原始数据矩阵 X X X中心化( X : = X − μ X:=X-\mu X:=Xμ);
  (2) 计算 X X X的协方差矩阵 C C C
  (3) 计算 C C C的特征值和特征向量,取前 k k k个最大的特征值对应的特征向量构成变换矩阵 P P P
  (4) 利用 Y = P X Y=PX Y=PX得到降维后的数据;
  (5) 计算 Y Y Y的协方差矩阵 D D D

4. 核心代码

def pca(X, k):
    # 样本中心化,axis=0表示计算每一列的均值
    X = X - np.mean(X, axis=0)
    # 将X变为nxm形式
    X = X.T
    # 计算协方差矩阵
    C_before = 1 / (X.shape[1]) * np.dot(X, X.T)
    # 计算特征值和对应的特征向量矩阵
    eigenvalues, eigenvectors = np.linalg.eig(C_before)
    # 求出最大的k个特征值的索引,np.argsort返回数组从小到大排序后的数在原数组中的索引
    indexes = np.argsort(eigenvalues)[::-1][:k]  # [::-1]将数组倒序,[:k]取前k个值
    # 选择特征向量矩阵中列索引在indexes中的所有列构成最终的投影矩阵
    P = eigenvectors[:, indexes]
    # 将特征向量转为沿行方向排列
    P = P.T
    # 计算降维结果Y=PX
    Y = np.dot(P, X)
    # 求降维之后的矩阵协方差
    C_after = np.cov(Y, rowvar=1)
    return C_before, Y, C_after

5. 实验结果

  我在程序中设置numpy的结果显示小数位为4位,原始数据的协方差矩阵、PCA后的数据、降维后的数据协方差矩阵如下:在这里插入图片描述

6.分析与总结

  1. 观察结果并对比PCA前后的协方差矩阵,可以得出以下结论:原始数据各维度特征携带的信息各不相同,有的特征携带的信息较多,有的特征携带的信息较少(观察主对角线元素),并且不同的特征之间的协方差值并不为0,这说明原始数据各维之间存在一定的相关性,即存在信息冗余的问题。而采用PCA对原始数据进行降至5维的处理后,可以看到协方差矩阵 D D D的主对角线元素值从第一行开始逐行递减,这表示第1主成分携带的信息量最大,其余主成分依次减小。此外, D D D的非主对角线元素全为0,这说明各维之间已经完全两两正交,即相关性已经被完全消除了,这使得信息的存储冗余度得到了减小。

  2. 在完成本次实验后,我尝试不使用np.linalg.eig()去求矩阵的特征值和特征向量,也就是先用 ∣ A − λ E ∣ = 0 |A-\lambda E|=0 AλE=0求出特征值,再用 ( A − λ E ) x = 0 (A-\lambda E)x=0 (AλE)x=0求出特征值对应的特征向量。在这个过程中,我使用了Python的SymPy库去解特征方程和特征向量对应的线性方程组。一开始解特征向量速度还是很快的,但是一旦去解线性方程组,运算速度就变得非常慢,在加上这其中涉及到np.array和sympy的Matrix数据类型的相互转化和结果的规范化,我最终放弃了自编函数实现特征值和特征向量的求解,这也让我感受到了numpy的线性代数库的代码优化做的确实很好,numpy中很多运算的实现都比我们自己手写实现的要快得多。

源码:多媒体数据处理实验2:PCA

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PCA(Principal Component Analysis,主成分分析)是一种常用的多媒体数据处理方法。其目的是通过对数据进行线性变换,将原始数据转换为一组新的相互独立的变量,称为主成分,以实现数据的降维和提取最具代表性的特征。 实现PCA主成分分析的步骤如下: 1. 数据预处理:对原始数据进行标准化处理,使得每个特征的均值为0,标准差为1,以消除各个特征之间的量纲差异。 2. 计算协方差矩阵:根据预处理后的数据,计算特征之间的协方差矩阵。协方差矩阵的每个元素表示两个特征之间的线性关系程度。 3. 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示对于数据变化最重要的方向,而特征向量则表示对应的主成分。 4. 选择主成分:按照特征值的大小,选取前k个特征值对应的特征向量作为主成分。选择的主成分应该能够解释大部分的数据变异。 5. 数据转换:将原始数据通过主成分的线性变换,得到新的数据集。每个样本在主成分上的投影值即为新的特征值。 通过PCA主成分分析,可以实现多媒体数据的降维和特征提取。降低数据的维度可以减少存储空间和计算复杂度,提高数据处理的效率。同时,通过主成分的选择,可以选取最具代表性和区分度的特征,对数据进行更好的分析和分类。因此,PCA主成分分析多媒体数据处理中具有广泛的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Polaris_T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值