why
信息的冗余增加计算成本,可以通过对数据的分析来降低数据的维度。principal component analysis(PCA)就是一种非常有效的方式。
what is PCA
我们试图通过线性映射矩阵 W W W 来对原始 d d d 维的特征空间 U = [ u 1 , u 2 , ⋯   , u d ] T U=[u_1,u_2,\cdots,u_d]^T U=[u1,u2,⋯,ud]T 进行降维,得到新的 m m m 维特征空间 V = [ v 1 , v 2 , ⋯   , v m ] T V = [v_1,v_2,\cdots,v_m]^T V=[v1,v2,⋯,vm]T,即 V = W T U V=W^TU V=WTU
v
i
=
∑
j
=
1
d
w
i
j
u
j
=
W
(
:
,
i
)
T
U
v_i= \sum\limits_{j=1}^dw_{ij}u_j=W(:,i)^TU
vi=j=1∑dwijuj=W(:,i)TU
为了统一新特征的尺度,线性映射的约束条件为
W
(
:
,
i
)
T
W
∗
(
:
,
i
)
=
1
W(:,i)^TW*(:,i)=1
W(:,i)TW∗(:,i)=1
我们的目标是使新特征的方差最大,即
W
^
=
max
W
v
a
r
(
V
)
\hat{W}=\max\limits_{W}var(V)
W^=Wmaxvar(V)
而
v
a
r
(
V
)
=
E
(
V
2
)
−
(
E
(
V
)
)
2
=
E
(
(
W
T
U
)
2
)
−
E
(
W
T
U
)
E
(
U
T
W
)
=
W
T
E
(
U
U
T
)
W
−
W
T
E
U
E
U
T
W
=
W
T
(
E
(
U
U
T
)
−
(
E
U
)
2
)
W
=
W
T
Σ
W
var(V)=E(V^2)-(E(V))^2=E((W^TU)^2)-E(W^TU)E(U^TW)=W^TE(UU^T)W-W^TEUEU^TW=W^T(E(UU^T)-(EU)^2)W=W^T\Sigma W
var(V)=E(V2)−(E(V))2=E((WTU)2)−E(WTU)E(UTW)=WTE(UUT)W−WTEUEUTW=WT(E(UUT)−(EU)2)W=WTΣW
其中,
Σ
\Sigma
Σ为原始特征
U
U
U的协方差矩阵
因此,最优化问题转换为
W
^
=
max
W
v
a
r
(
V
)
=
max
W
W
T
Σ
W
s
.
t
.
W
T
W
=
1
\hat{W}=\max\limits_{W}var(V)=\max\limits_W W^T\Sigma W\qquad s.t. \quad W^TW=1
W^=Wmaxvar(V)=WmaxWTΣWs.t.WTW=1
用拉格朗日乘子法解上式,构造函数
L
(
W
)
=
W
T
Σ
W
−
λ
(
W
T
W
−
1
)
L(W) =W^T\Sigma W-\lambda(W^TW-1)
L(W)=WTΣW−λ(WTW−1)
则
0
=
∂
L
∂
W
=
Σ
W
−
λ
W
0
=
∂
L
∂
λ
=
W
T
W
−
1
0=\frac{\partial L}{\partial W}=\Sigma W-\lambda W \\ 0=\frac{\partial L}{\partial \lambda}=W^TW-1
0=∂W∂L=ΣW−λW0=∂λ∂L=WTW−1
由
λ
W
=
Σ
W
\lambda W=\Sigma W
λW=ΣW可知:最优解
W
^
\hat{W}
W^为原始特征的协方差矩阵所对应的特征向量。
由 max W W T Σ W = max W W T λ W = max W λ ( W T W ) = max W λ \max\limits_WW^T\Sigma W=\max\limits_WW^T\lambda W=\max\limits_W\lambda(W^TW)=\max\limits_W\lambda WmaxWTΣW=WmaxWTλW=Wmaxλ(WTW)=Wmaxλ 可知目标函数的最值为协方差矩阵的最大特征向量。
因此,最优解 W ^ \hat {W} W^为原始特征向量协方差矩阵的最大特征值对应的特征向量。
how do PCA
step1:获取带标签的数据
step2:数据进行去均值处理
step3:计算原始特征的协方差矩阵
step4:计算协方差矩阵的特征值可特征向量
step5:选择最大的K个特征值对应的特征向量作为降维之后的K维特征空间
matlab实例
这里以yale人脸数据集为例,给出一段用PCA降维之后,再用KNN分类的列子,抛砖引玉
clc;clear;close all;
data = importdata('yale_face_data.mat');
train_fea = data.train_fea;
mean_train_fea = mean(train_fea')';
for i = 1:size(train_fea,2)
mean_subtract_train_fea(:,i) = train_fea(:,i)-mean_train_fea;
end
Conv_train_fea = mean_subtract_train_fea*mean_subtract_train_fea';
[V_train,D_train] = eig(Conv_train_fea);
%% PCA
for K=1:100
W = V_train(:,size(V_train,2)-K+1:1:size(V_train,2));
PCA_new_train_fea = W'*mean_subtract_train_fea;
%% 1_NN
test_fea = data.test_fea;
mean_test_fea = mean(test_fea')';%
for i = 1:size(test_fea,2)
mean_subtract_test_fea(:,i) = test_fea(:,i)-mean_test_fea;
end
new_test_fea = W'*mean_subtract_test_fea;
for i=1:size(new_test_fea,2)
for j=1:size(train_fea,2)
temp_vec = new_test_fea(:,i)-PCA_new_train_fea(:,j);
temp(j) = temp_vec'*temp_vec;
end
[m,n] = min(temp);
t(i) = data.train_gnd(n);
end
t_out=[t;data.test_gnd];
flag = t_out(1,:)-t_out(2,:);
num_right_PCA(K) = sum(flag==0);
end
plot(1:K,num_right_PCA,'o');
axis([0 K 0 45]);
title('PCA+1-NN')
xlabel('num\_k')
ylabel('num\_right')