欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

使用pca进行坐标系转换、降维

发布时间:2024/3/13 57 豆豆
生活随笔 收集整理的这篇文章主要介绍了 使用pca进行坐标系转换、降维 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

利用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维)是这样的:
    这样一来降维的效果就不好了。

    总结

    以上是生活随笔为你收集整理的使用pca进行坐标系转换、降维的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。