百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

PCA降维算法及MATLAB实现

bigegpt 2024-08-21 12:05 2 浏览

PCA原理:

PCA的原理就是将原来的样本数据投影到一个新的空间中,相当于我们在矩阵分析里面学习的将一组矩阵映射到另外的坐标系下。通过一个转换坐标,也可以理解成把一组坐标转换到另外一组坐标系下,但是在新的坐标系下,表示原来的原本不需要那么多的变量,只需要原来样本的最大的一个线性无关组的特征值对应的空间的坐标即可。

下面是百度百科中对pca降维的一段解释,还是挺清晰的:

“对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。

当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。”

pca的实现(matlab)

我在网上看了很多pca降维的例子,都大同小异,原理差不多,都是活的原来矩阵的协方差矩阵,然后计算协方差矩阵的特征值和特征向量,最后通过特征向量的根据特征值由大到小的排序进行KL变换神马的获得一个转换矩阵。

1. matlab自带的实现方式

PCA在matlab中的实现举例

  以下资料来自matlab的help,翻译和注解部分由笔者添加:(重点部分添加了翻译!)

princomp-----函数名称

  Principal component analysis (PCA) on data

  Syntax------函数调用语法

  [COEFF,SCORE] = princomp(X)

  [COEFF,SCORE,latent] = princomp(X)

  [COEFF,SCORE,latent,tsquare] = princomp(X)

  [...] = princomp(X,'econ')

Description -----函数描述

上面这个matlab函数的说明呢,只是引用百度百科,也可以看看matlab的函数说明,但是多少还是有点难懂。

我把我的理解简单的说说。

[COEFF, SCORE, LATENT, TSQUARED] = PRINCOMP(X)

上面这个函数,coeff矩阵是返回的转换矩阵,也就是把样本转换到新的空间中的准换矩阵,这个准换矩阵式比较大的,比如你的降维矩阵式30*100000,那么这个准换矩阵一般都是10000*29的维数。

score是原来的样本矩阵在新的坐标系中的表示,也就是原来的样本乘上转换矩阵,但是还不是直接乘,要减去一个样本的均值。将原来的数据转换到新的样本空间中的算法是这样实现的:

x0 = bsxfun(@minus,x,mean(x,1));

score = x0 * coeff;

然后就会得到和[COEFF, SCORE, LATENT, TSQUARED] = PRINCOMP(X) 输出一样的score数据。 同时这个也是原来的样本矩阵降维后的结果,如果使用降维后的数据就使用这个数据。一般情况下,如果你的每个样本的特征维数远远大于样本数,比如30*1000000的维数,princomp要加上'econ', 就是princomp(x,'econ')这样使用,可以很大程度的加快计算速度,而且不会内存溢出,否则会经常报内存溢出。

[...] = PRINCOMP(X,'econ') returns only the elements of LATENT that are

not necessarily zero, i.e., when N <= P, only the first N-1, and the

corresponding columns of COEFF and SCORE. This can be significantly

faster when P >> N.

latent是返回的按降序排列的特征值,根据这个你可以手动的选择降维以后的数据要选择前多少列。

cumsum(latent)./sum(latent),通过这样计算特征值的累计贡献率,一般来说都选择前95%的特征值对应的特征向量,还是原来的矩阵30*1000000,如果你计算得到前25个特征值的累计贡献率已经超过99.9%,那么就完全可以只要降维后的数据的前25列

如果你需要对测试样本降维,一般情况下,使用matlab自带的方式,肯定需要对测试样本减去一个训练样本均值,因为你在给训练样本降维的时候减去了均值,所以测试样本也要减去均值,然后乘以coeff这个矩阵,就获得了测试样本降维后的数据。比如说你的测试样本是1*1000000,那么乘上一个1000000*29的降维矩阵,就获得了1*29的降维后的测试样本的降维数据。

princomp(x)使用的行表示一个样本,每行的所有的列数据都是这个样本的特征值。降维以后比如是30*29,那么每一行就是降维以后的数据。每个样本有29个特征值。

2. 一个自实现的pca降维方式

1.%训练

2.%Lx=X'*X

3.clear;

4.clc;

5.train_path='..\Data\TrainingSet\';

6.phi=zeros(64*64,20);

7.for i=1:20

8.path=strcat(train_path,num2str(i),'.bmp');

9.Image=imread(path);

10. Image=imresize(Image,[64,64]);

11. phi(:,i)=double(reshape(Image,1,[])');

12. end;

13. %mean

14. mean_phi=mean(phi,2);

15. mean_face=reshape(mean_phi,64,64);

16. Image_mean=mat2gray(mean_face);

17. imwrite(Image_mean,'meanface.bmp','bmp');

18. %demean

19. for i=1:19

20. X(:,i)=phi(:,i)-mean_phi;

21. end

22. Lx=X'*X;

23. tic;

24. [eigenvector,eigenvalue]=eigs(Lx,19);

25. toc;

26. %normalization

27. for i=1:19

28. %K-L变换

29. UL(:,i)=X*eigenvector(:,i)/sqrt(eigenvalue(i,i));

30. end

31. %display Eigenface

32. for i=1:19

33. Eigenface=reshape(UL(:,i),[64,64]);

34. figure(i);

35. imshow(mat2gray(Eigenface));

36. end

得到的均值图像mean_face:

前19个最大主元对应的“特征脸”:

测试:

测试用样本:

37. %使用测试样本进行测试

38. clc;

39. test_path='..\Data\TestingSet\';

40. error=zeros([1,4]);

41. for i=1:4

42. path=strcat(test_path,num2str(i),'.bmp');

43. Image=imread(path);

44. Image=double(imresize(Image,[64,64]));

45. phi_test=zeros(64*64,1);

46. phi_test(:,1)=double(reshape(Image,1,[])');

47. X_test=phi_test-mean_phi;

48. Y_test=UL'*X_test;

49. X_test_re=UL*Y_test;

50. Face_re=X_test_re+mean_phi;

51. calculate error rate

52. e=Face_re-phi_test;

53.

54.

55. %%display figure

56. Face_re_2=reshape(Face_re(:,1),[64,64]);

57. figure(i);

58.

59. imshow(mat2gray(Image));

60. title('Original');

61. figure(10+i);

62. imshow(mat2gray(Face_re_2));

63. title('Reconstruct');

64. error(1,i)=norm(e);

65.

66. %dispaly error rate

67. error_rate=error(1,i);

68. display(error_rate);

69. end

重建出的测试样本与原样本的对比:

四副测试样本的重建误差分别为:

1.4195e+003

1.9564e+003

4.7337e+003

7.0103e+003

可见测试样本为人脸的样本的重建误差显然小于非人脸的重建误差。

下面先给出一下PCA的资料地址,供大家参考

http://hi.baidu.com/yicomrdztxbeiwd/item/913f28c05cf7ebc4994aa06f

http://blog.sciencenet.cn/blog-265205-544681.html

http://blog.csdn.net/mpbchina/article/details/7384425

http://blog.sina.com.cn/s/blog_6833a4df0100pvk7.html

http://stackoverflow.com/questions/4991343/matlab-principal-component-analysis-eigenvalues-order

http://stackoverflow.com/questions/10400230/what-is-score-in-princomp

http://www.mathworks.com/matlabcentral/newsreader/view_thread/152608

http://stats.stackexchange.com/questions/27572/matlab-princomp-latent

http://www.nlpca.org/pca-principal-component-analysis-matlab.html

http://www.matlabsky.com/thread-11751-1-1.html

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...