赞
踩
PCA英文全名为Principal components analysis,主成分分析。PCA的作用是降维,利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分。
PCA是无监督的降维方法,主要思想是将数据映射到维度更低的空间,这样可以减少对这些数据进行计算的计算量,同时进行PCA操作后也要保证数据易于进行特征的提取,需要使得映射后数据的方差最大(可以想象为将数据之间分得最开,易于进行分类等),因此使得当前数据集方差最大的方向为主成分的方向。
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\{
将上述式子进行处理,
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[
则上式= 2 m ( X W ) T X \frac{2}{m}(XW)^{T}X m2(XW)TX,所以可知要求得W是需要迭代的过程
待更新…
进行一个小实验来实现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画出图像为:
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]可知两个方向是垂直的。循环下去可以求出所有组成分!
优点:上文已经实现了PCA,PCA提取了组成分,所以一定程度上能够减少噪声。
缺点:PCA是无监督的,PCA处理后的数据删了贡献率小的数据,可能对分类等操作并不友好
未完待续…
[1].https://www.cnblogs.com/kemaswill/archive/2013/01/13/2858387.html
[2].https://zhuanlan.zhihu.com/p/47858230
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。