PCA(降维)原理与实现

1.PCA原理

1.1概念

PCA英文全名为Principal components analysis,主成分分析。PCA的作用是降维,利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分。

PCA是无监督的降维方法,主要思想是将数据映射到维度更低的空间,这样可以减少对这些数据进行计算的计算量,同时进行PCA操作后也要保证数据易于进行特征的提取,需要使得映射后数据的方差最大(可以想象为将数据之间分得最开,易于进行分类等),因此使得当前数据集方差最大的方向为主成分的方向。

1.2公式推导

PCA的假设偏好是:数据分得越开越好!常见的推导方法有最大化方差法与最大可分性。下面具体对两种方法的思想进行探索!

方式一:最大化方差

最大化方差法是将数据映射到低维度,要求映射后的数据方差最大。首先可以将数据直接映射到一维,方差最大的方向为第一组成分,将第一组成分的方向从原数据中减去,再求数据的最大组成分,即可得到第二组成分,同理得到所有的组成分。
假设数据为 X X X,维度为(m,n),并已经做了映射后的第一主成分 X p r o j e c t X_{project} Xproject W W W的维度为(n,1)且 W W T = I WW^\mathrm{T}=I WWT=I(这样设计是为了后续计算的方便性)。

映射后数据的方差为Var( X p r o j e c t X_{project} Xproject)= 1 m ( ∑ i = 1 m X ( i ) W ) 2 \frac{1}{m}(\sum_{i=1}^{m}X^{(i)}W)^2 m1(i=1mX(i)W)2= 1 m ( ∑ i = 1 m x 1 ( i ) w 1 + x 2 ( i ) w 2 + . . . + x n ( i ) w n ) 2 \frac{1}{m}(\sum_{i=1}^m x^{(i)}_{1}w_{1}+x^{(i)}_{2}w_{2}+...+x^{(i)}_{n}w_{n})^{2} m1(i=1mx1(i)w1+x2(i)w2+...+xn(i)wn)2

令F( W W W)= 1 m ( ∑ i = 1 m x 1 ( i ) w 1 + x 2 ( i ) w 2 + . . . + x n ( i ) w n ) 2 \frac{1}{m}(\sum_{i=1}^m x^{(i)}_{1}w_{1}+x^{(i)}_{2}w_{2}+...+x^{(i)}_{n}w_{n})^{2} m1(i=1mx1(i)w1+x2(i)w2+...+xn(i)wn)2,对F( W W W)中 W W W的每个维度求导,得结果为:

d ( F ( W ) ) d ( w i ) = { 2 m ( ∑ i = 1 m X ( i ) W ) x 1 ( i ) . . . 2 m ( ∑ i = 1 m X ( i ) W ) x n ( i ) \frac{d(F(W))}{d(w_{i})}=\left\{ \begin{aligned} & \frac{2}{m}(\sum_{i=1}^m X^{(i)}W)x^{(i)}_{1}\\ & ... \\ & \frac{2}{m}(\sum_{i=1}^m X^{(i)}W)x^{(i)}_{n} \end{aligned} \right. d(wi)d(F(W))=m2(i=1mX(i)W)x1(i)...m2(i=1mX(i)W)xn(i)

将上述式子进行处理,
d ( F ( W ) ) d ( w i ) = 2 m ( X ( 1 ) W , X ( 2 ) W , . . . , X ( m ) W ) ∗ [ x 1 ( 1 ) x 2 ( 1 ) . . . x n ( 1 ) x 1 ( 2 ) x 2 ( 2 ) . . . x n ( 2 ) . . . . . . . . . . . . . x 1 ( m ) x 2 ( m ) . . . x n ( m ) ] \frac{d(F(W))}{d(w_{i})}= \frac{2}{m}(X^{(1)}W,X^{(2)}W,...,X^{(m)}W)* \left[ \begin{matrix} x^{(1)}_{1} & x^{(1)}_{2} &...& x^{(1)}_{n} \\ x^{(2)}_{1} & x^{(2)}_{2} &...& x^{(2)}_{n} \\ .... & ... & ...&...\\ x^{(m)}_{1} & x^{(m)}_{2} &...& x^{(m)}_{n} \end{matrix} \right] d(wi)d(F(W))=m2(X(1)W,X(2)W,...,X(m)W)x1(1)x1(2)....x1(m)x2(1)x2(2)...x2(m)............xn(1)xn(2)...xn(m)

则上式= 2 m ( X W ) T X \frac{2}{m}(XW)^{T}X m2(XW)TX,所以可知要求得W是需要迭代的过程

方式二:最大可分性

待更新…

2.实现PCA(最大化方差法)

2.1构建数据

进行一个小实验来实现PCA,使用numpy构建出一个线性数据出来,数据中加入数据扰动

x = np.empty((100, 2))
x[:, 0] = np.random.uniform(0, 100, size=100)
x[:, 1] = 0.75*x[:, 0]+3+np.random.normal(0, 10, size=100)

matplotlib画出图像为:
在这里插入图片描述

2.2实现过程
def direction(w):
    return w/np.linalg.norm(w)
def f(w, x):
    return np.sum((x.dot(w))**2)/len(x)
eplison=1e-8
eta=0.001
iters = 1
last_w = 0
x = (x-np.min(x))/np.max(x)-np.min(x)
w = np.ones((x.shape[1],1))
while iters<1000:
    iters+=1
    grid = 2*x.T.dot(x.dot(w))/len(x)
    last_w = w
    w = direction(last_w+grid*eta)
    if abs(f(w,x)-f(last_w,x)) < eplison:
        break

得到w即为第一组成分,画出结果
w=[0.78437038, 0.62029276]

plt.scatter(x[:, 0], x[:, 1])
plt.plot([-50, w1[0]*80], [-50, w1[1]*80], color='r')
plt.show()

在这里插入图片描述
上面只是求出了PCA的第一组成分,接下来可以求第二组成分,因为组成分是相互垂直的,所以可以将原来的 X X X减去第一组成分上的变量再对剩余的数据求解组成分。

x2 = np.empty(x.shape)
x2 = x_dmean-x_dmean.dot(w).reshape(-1, 1)*w

再对x2进行组成分分析,即可得到w2=[-0.62027729, 0.78438261],根据上面的w= [0.78437038, 0.62029276]可知两个方向是垂直的。循环下去可以求出所有组成分!

3.理解PCA

优点:上文已经实现了PCA,PCA提取了组成分,所以一定程度上能够减少噪声。
缺点:PCA是无监督的,PCA处理后的数据删了贡献率小的数据,可能对分类等操作并不友好

未完待续…

参考资料

[1].https://www.cnblogs.com/kemaswill/archive/2013/01/13/2858387.html
[2].https://zhuanlan.zhihu.com/p/47858230

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值