利用PCA进行坐标系转换
pca是一种常用的数据降维的方法,而其中的降维的步骤就是:
- 选取前 k 个特征值。
如果我们不选择这个步骤,那么就不会进行降维了,反而会进行坐标系的转换。
具体步骤
1、首先生成高斯二维分布的数据
matlab代码
mul = [1 2];
SIGMA = [1 0.81; 0.81 1];
data1 = mvnrnd(mul,SIGMA,500);
plot(data1(:,1),data1(:,2),'*');
axis equal
2. 使用PCA进行坐标轴的选取
新坐标的优化目的:使得坐标轴正交,并且沿着这些坐标方向的数据的方差最大。
clear;clc;close all;
mul = [1 2];
SIGMA = [1 0.81; 0.81 1];
data1 = mvnrnd(mul,SIGMA,500);
[pc,score,latent] = pca(data1);
figure(1)
axis equal
plot(data1(:,1),data1(:,2),'*');
hold on
quiver(1,2,pc(1,1),pc(2,1),5)
quiver(1,2,pc(1,2),pc(2,2),5)
plot(sore(:,1),score(:,2))
这样就可以建立出新的坐标系。
3.m代码主要流程介绍
- 生成高斯二维分布的随机数据
- pca函数的使用
- 在坐标上画向量
PCA进行多维降维以及降维效果的评价
有时候pca降维的时候会损失数据的局部的流形,造成不好的效果。
1、生成数据
先定义一个函数,用来生成一系列有规律的点
%生成一系列园点
function [x1,y1] = creat_circle(r1 , r1_ratio,sita_ratio)
sita = 0:0.05:2*pi;
all_num = size(sita);
all_num = all_num(1,2);
%rand : sita
sita_p = randperm(all_num,floor(sita_ratio*all_num));
%rand : r
r_p = rand(1,floor(sita_ratio*all_num))*r1*r1_ratio;
r1_p = repmat(r1,1,floor(sita_ratio*all_num));
r1_p = r1_p - r_p;
x1 = r1_p.*cos(sita_p);
y1 = r1_p.*sin(sita_p);
scatter(x1,y1)
然后运行下列代码:
% 建立坐标点
clear;clc;close all;
[x1,y1] = creat_circle(3,0.05,0.95);
[x2,y2] = creat_circle(5,0.05,0.95);
[x3,y3] = creat_circle(9,0.05,0.95);
num = size(x1);
z1 = normrnd(5,1,1,num(1,2))+x1;
z2 = wgn(1,num(1,2),1)+4+y2;
z3 = rand(1,num(1,2))+2+x3;
% 画
figure(1)
scatter(x1,y1,'r')
hold on
scatter(x2,y2,'b')
scatter(x3,y3,'g')
figure(2)
scatter3(x1,y1,z1,'r')
hold on
scatter3(x2,y2,z2,'b');
scatter3(x3,y3,z3,'g');
生成好以后,我们可以看看这些点的分布。
换个角度,可以看出规律。我们希望降维后也保存这种规律。
然而实际上,使用PCA进行降维后(降到2维)是这样的:
这样一来降维的效果就不好了。