当前位置:   article > 正文

PCA(降维)原理与实现_pca降维原理

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\{

2m(i=1mX(i)W)x1(i)...2m(i=1mX(i)W)xn(i)
\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[

x1(1)x2(1)...xn(1)x1(2)x2(2)...xn(2).............x1(m)x2(m)...xn(m)
\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)
  • 1
  • 2
  • 3

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

得到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()
  • 1
  • 2
  • 3

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

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

再对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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/106923
推荐阅读
相关标签
  

闽ICP备14008679号