PCA

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=1dwijuj=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)WWTEUEUTW=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λ(WTW1)

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=WL=ΣWλW0=λL=WTW1
λ 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')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值