降维之PCA原理及推导


主成分分析(Principal components analysis,以下简称PCA)是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。

是一种线性、非监督、全局降维算法

两种方法:最大化方差理论、最小平方误差理论

1、PCA思想

PCA旨在找到数据中的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。假如有数据集是n维的,有m个数据,期望将这m个数据的维度从n维降到某个维度,并尽可能代表原始数据集。

在信号处理领域,一般认为信号具有较大的方差,而噪声具有较小的方差,信号与噪声之比成为信噪比,信噪比越大意味着数据的质量越好,由此得出PCA的目标是最大化投影方差,即让数据在主轴上投影的方差最大。

2、基础知识

  • 內积 : ( a 1 , a 2 , ⋯   , a n ) T ⋅ ( b 1 , b 2 , ⋯   , b n ) T = a 1 b 1 + a 2 b 2 + ⋯ + a n b n (a_1,a_2,\cdots,a_n)^\mathsf{T}\cdot (b_1,b_2,\cdots,b_n)^\mathsf{T}=a_1b_1+a_2b_2+\cdots+a_nb_n (a1,a2,,an)T(b1,b2,,bn)T=a1b1+a2b2++anbn

    A ⋅ B = ∣ A ∣ ∣ B ∣ c o s ( a ) A\cdot B=|A||B|cos(a) AB=ABcos(a)

    A与B的内积等于A到B的投影长度乘以B的模。再进一步,如果我们假设B的模为1,即让|B|=1,那么就变成了:

    A ⋅ B = ∣ A ∣ c o s ( a ) A\cdot B=|A|cos(a) AB=Acos(a)

    也就是说,设向量B的模为1,则A与B的内积值等于A向B所在直线投影的矢量长度
    在这里插入图片描述

在这里插入图片描述
在代数表示方面,我们经常用线段终点的点坐标表示向量,例如上面的向量可以表示为(3,2),这是我们再熟悉不过的向量 表示。

不过我们常常忽略,只有一个(3,2)本身是不能够精确表示一个向量的。我们仔细看一下,这里的3实际表示的是向量在x轴上的投影值是3,在y轴上的投影值是2。也就是说我们其实隐式引入了一个定义:以x轴和y轴上正方向长度为1的向量为标准。那么一个向量(3,2)实际是说在x轴投影为3而y轴的投影为2。注意投影是一个矢量,所以可以为负。

更正式的说,向量(x,y)实际上表示线性组合: x ( 1 , 0 ) T + y ( 0 , 1 ) T x(1,0)^T+y(0,1){T} x(1,0)T+y(0,1)T

此处(1,0)和(0,1)叫做二维空间中的一组基。

所以,要准确描述向量,首先要确定一组基,然后给出在基所在的各个直线上的投影值,就可以了。只不过我们经常省略第一步,而默认以(1,0)和(0,1)为基。

我们之所以默认选择(1,0)和(0,1)为基,当然是比较方便,因为它们分别是x和y轴正方向上的单位向量,因此就使得二维平面上点坐标和向量一一对应,非常方便。但实际上任何两个线性无关的二维向量都可以成为一组基,所谓线性无关在二维平面内可以直观认为是两个不在一条直线上的向量

一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。(新基按行,向量按列)
( p 1 p 2 ⋮ p R ) ( a 1 a 2 ⋯ a M ) = ( p 1 a 1 p 1 a 2 ⋯ p 1 a M p 2 a 1 p 2 a 2 ⋯ p 2 a M ⋮ ⋮ ⋱ ⋮ p R a 1 p R a 2 ⋯ p R a M ) \begin{pmatrix} p_1 \\ p_2 \\ \vdots \\ p_R \end{pmatrix} \begin{pmatrix} a_1 & a_2 & \cdots & a_M \end{pmatrix}= \begin{pmatrix} p_1a_1 & p_1a_2 & \cdots & p_1a_M \\ p_2a_1 & p_2a_2 & \cdots & p_2a_M \\ \vdots & \vdots & \ddots & \vdots \\ p_Ra_1 & p_Ra_2 & \cdots & p_Ra_M \end{pmatrix} p1p2pR(a1a2aM)=p1a1p2a1pRa1p1a2p2a2pRa2p1aMp2aMpRaM

其中pi是一个行向量,表示第i个基,aj是一个列向量,表示第j个原始数据记录。
两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。

  • 方差
    V a r ( a ) = 1 m ∑ i = 1 m ( a i − μ ) 2 Var(a)=\frac{1}{m}\sum_{i=1}^m{(a_i-\mu)^2} Var(a)=m1i=1m(aiμ)2
    将每个字段的均值都化为0,因此方差可以直接用每个元素的平方和除以元素个数表示:
    V a r ( a ) = 1 m ∑ i = 1 m a i 2 Var(a)=\frac{1}{m}\sum_{i=1}^m{a_i^2} Var(a)=m1i=1mai2
  • 协方差
    • 对于上面二维降成一维的问题来说,找到那个使得方差最大的方向就可以了。不过对于更高维,还有一个问题需要解决。考虑三维降到二维问题。与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们选择第二个投影方向。

    • 如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
      C o v ( a , b ) = 1 m ∑ i = 1 m ( a i 1 − a ˉ 1 ) ( a i 1 − a ˉ 1 ) Cov(a,b)=\frac{1}{m}\sum\nolimits_{i=1}^{m} (a_{i1} - \bar{a}_1)(a_{i1} - \bar{a}_1) Cov(a,b)=m1i=1m(ai1aˉ1)(ai1aˉ1)
      数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则:
      C o v ( a , b ) = 1 m ∑ i = 1 m a i b i Cov(a,b)=\frac{1}{m}\sum_{i=1}^m{a_ib_i} Cov(a,b)=m1i=1maibi

  • 协方差矩阵
    1 m − 1 ∑ i = 1 m ( x i − x ˉ ) ( x i − x ˉ ) T \frac{1}{m-1}\sum\nolimits_{i=1}^{m} (x_i - \bar{x})(x_i - \bar{x})^T m11i=1m(xixˉ)(xixˉ)T

推导

最大化方差理论

推导

w 为 单 位 方 向 向 量 , 故 w为单位方向向量,故 w w T w = 1 w^Tw=1 wTw=1
在这里插入图片描述

通过上述推导得:

  • 最大化方差就是协方差矩阵的最大特征值,最佳投影方向就是最大特征值所对应的的特征向量
  • 次投影方向就是就是第二大特征值对应的特征向量

步骤

(1)对样本数据进行中心化处理
(2)求样本的协方差矩阵
(3)对协方差矩阵进行特征值分解,特征值按大到小排序
(4)取特征值前d大的对应特征向量

1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据

映射后
x i , = [ w 1 T x i w 2 T x i ⋮ w d T x i ] x_i^, = \left[ \begin{matrix} w_1^Tx_i \\ w_2^Tx_i \\ \vdots \\ w_d^Tx_i \\ \end{matrix} \right] xi,=w1Txiw2TxiwdTxi

信息占比
η = ∑ i = 1 d λ i 2 ∑ i = 1 n λ i 2 \eta = \sqrt \frac{\sum_{i=1}^d\lambda_i^2}{\sum_{i=1}^n\lambda_i^2} η=i=1nλi2i=1dλi2

最小平方误差理论

采用此方法求得的最佳投影与上个方法一致,具体可参考百面机器学习第四章

参考:http://blog.codinglabs.org/articles/pca-tutorial.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PCA(Principal Component Analysis)是一种常用的维算法,它通过线性变换将高维数据映射到低维空间中,且尽可能多地保留原始数据的信息。PCA的核心思想是将原始数据投影到新的坐标系上,新坐标系的选择是使得投影后数据方差最大的方向,也就是数据的主成分方向。以下是PCA维的步骤: 1. 数据预处理:对数据进行标准化处理,使得每个特征的均值为0,方差为1。 2. 计算协方差矩阵:协方差矩阵反映了特征之间的相关性,计算公式为:$\Sigma=\frac{1}{n-1}(X-\bar{X})^{T}(X-\bar{X})$,其中 $X$ 为 $n$ 行 $m$ 列的数据矩阵,$\bar{X}$ 为 $m$ 维向量,表示每一列的均值。 3. 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和特征向量。 4. 选取主成分:将特征值按照从大到小的顺序排列,选择前 $k$ 个特征值对应的特征向量,组成新的 $k$ 维特征空间。 5. 投影到新的特征空间:将原始数据投影到新的 $k$ 维特征空间中,得到维后的数据。 下面是Python实现PCA维的代码: ```python import numpy as np class PCA: def __init__(self, n_components): self.n_components = n_components def fit_transform(self, X): # 数据预处理 X_std = (X - np.mean(X, axis=0)) / np.std(X, axis=0) # 计算协方差矩阵 cov_mat = np.cov(X_std.T) # 计算特征值和特征向量 eigenvals, eigenvecs = np.linalg.eig(cov_mat) # 选取前n个特征向量 idx = eigenvals.argsort()[::-1] eigenvecs = eigenvecs[:, idx][:, :self.n_components] # 投影到新的特征空间 X_new = np.dot(X_std, eigenvecs) return X_new ``` 使用示例: ```python import numpy as np from sklearn.datasets import load_iris # 加载数据 iris = load_iris() X = iris.data # PCApca = PCA(n_components=2) X_new = pca.fit_transform(X) # 可视化 import matplotlib.pyplot as plt plt.scatter(X_new[:,0], X_new[:,1], c=iris.target) plt.show() ``` 这里使用了鸢尾花数据集进行演示,将原始数据从4维到了2维,并将结果可视化出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凯旋的皇阿玛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值