PCA(主成分分析)算法,主要用于数据降维,保留了数据集中对方差贡献最大的若干个特征来达到简化数据集的目的。

实现数据降维的步骤:

1、将原始数据中的每一个样本用向量表示,把所有样本组合起来构成一个矩阵,通常需对样本矩阵进行处理,得到中性化样本矩阵

2、求样本矩阵的协方差矩阵

3、求协方差矩阵的特征值和特征向量

4、将求出的特征向量按照特征值的大小进行组合形成一个映射矩阵。并根据指定的PCA保留的特征个数取出映射矩阵的前n行或者前n列作为最终的映射矩阵。

5、用映射矩阵对数据进行映射,达到数据降维的目的。

中心化样本矩阵:先让样本矩阵中心化,即每一维度减去该维度的均值,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可,如下:

 % 中心化样本矩阵,样本矩阵MySample是10*3大小的矩阵,repmat(mean(MySample),10,1)产生一个每行都是mean(Mysample),共10行
X = MySample – repmat(mean(MySample),10,1); %每一维度减去该维度的均值
%X=X-ones(size(X,1),1)*mean(X);这样同样可以达到每一维度减去该维度的均值的效果,相比上面那种,这种更通用,因为不须每次改写repmat中的第二个参数
C = (X’*X)/(size(X,1)-1)%新得到的矩阵X乘上的它的转置

PCA算法Matlab实现:

 function [newX,T,meanValue] = pca_row(X,CRate)
%每行是一个样本
%newX 降维后的新矩阵
%T 变换矩阵
%meanValue X每列均值构成的矩阵,用于将降维后的矩阵newX恢复成X
%CRate 贡献率
%计算中心化样本矩阵
meanValue=ones(size(X,1),1)*mean(X);
X=X-meanValue;%每个维度减去该维度的均值
C=X'*X/(size(X,1)-1);%计算协方差矩阵 %计算特征向量,特征值
[V,D]=eig(C);
%将特征向量按降序排序
[dummy,order]=sort(diag(-D));
V=V(:,order);%将特征向量按照特征值大小进行降序排列
d=diag(D);%将特征值取出,构成一个列向量
newd=d(order);%将特征值构成的列向量按降序排列 %取前n个特征向量,构成变换矩阵
sumd=sum(newd);%特征值之和
for j=1:length(newd)
  i=sum(newd(1:j,1))/sumd;%计算贡献率,贡献率=前n个特征值之和/总特征值之和
  if i>CRate%当贡献率大于95%时循环结束,并记下取多少个特征值
    cols=j;
    break;
  end
end
T=V(:,1:cols);%取前cols个特征向量,构成变换矩阵T
newX=X*T;%用变换矩阵T对X进行降维
end

测试数据:

>> test=[10 15 29;15 46 13;23 21 30;11 9 35;42 45 11;9 48 5;11 21 14;8 5 15;11 12 21;21 20 25]

test =

10 15 29
15 46 13
23 21 30
11 9 35
42 45 11
9 48 5
11 21 14
8 5 15
11 12 21
21 20 25

调用函数:

[newX,T,meanValue]=pca_row(test,0.9)%假设贡献率为90%

newX =

13.4627 -0.1472
-21.2616 -6.1205
4.7222 11.1751
20.7366 4.1128
-29.3539 16.6403
-24.3452 -15.3551
2.0237 -6.9416
17.2018 -7.6807
12.5972 -2.8162
4.2167 7.1330

T =

-0.3025 0.8750
-0.8672 -0.0881
0.3956 0.4760

meanValue =

16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000
16.1000 24.2000 19.8000

将降维后得到的新矩阵newX恢复:

公式为X=newX*T'+meanValue

得到:

X =

11.8983 12.5383 25.0552
17.1770 43.1771 8.4762
24.4495 19.1203 26.9878
13.4252 5.8552 29.9604
39.5407 48.1891 16.1105
10.0297 46.6648 2.8603
9.4139 23.0567 17.2959
4.1753 9.9596 22.9479
9.8247 13.5240 23.4422
21.0656 19.9149 24.8636

可以看到与原X有些误差

对于该组测试数据当CRate设置为0.97时,恢复时可以100%恢复

参考资料:

1、PCA算法学习_1(OpenCV中PCA实现人脸降维),作者:tornadomeet

2、PCA算法学习_2(PCA理论的matlab实现),作者:tornadomeet

3、PCA(主成分分析)详解(写给初学者)结合matlab,作者:古剑寒

4、PCA降维算法总结以及matlab实现PCA(个人的一点理解),作者:watkins

PCA算法学习(Matlab实现)的更多相关文章

  1. 大约PCA算法学习总结

    文章来源:http://blog.csdn.net/xizhibei ============================= PCA,也就是说,PrincipalComponents Analys ...

  2. 【转】PCA算法学习_1(OpenCV中PCA实现人脸降维)

    前言: PCA是大家经常用来减少数据集的维数,同时保留数据集中对方差贡献最大的特征来达到简化数据集的目的.本文通过使用PCA来提取人脸中的特征脸这个例子,来熟悉下在oepncv中怎样使用PCA这个类. ...

  3. OpenCV学习(35) OpenCV中的PCA算法

    PCA算法的基本原理可以参考:http://www.cnblogs.com/mikewolf2002/p/3429711.html     对一副宽p.高q的二维灰度图,要完整表示该图像,需要m = ...

  4. 我所认识的PCA算法的princomp函数与经历 (基于matlab)

    我接触princomp函数,主要是因为实验室的项目需要,所以我一接触的时候就希望快点学会怎么用. 项目中需要利用PCA算法对大量数据进行降维. 简介:主成分分析 ( Principal Compone ...

  5. PCA and kmeans MATLAB实现

    MATLAB基础知识 l  Imread:  读取图片信息: l  axis:轴缩放:axis([xmin xmax ymin ymax zmin zmax cmin cmax]) 设置 x.y 和  ...

  6. 模式识别(1)——PCA算法

    作者:桂. 时间:2017-02-26  19:54:26 链接:http://www.cnblogs.com/xingshansi/articles/6445625.html 声明:转载请注明出处, ...

  7. 主成分分析(PCA)学习笔记

    这两天学习了吴恩达老师机器学习中的主成分分析法(Principal Component Analysis, PCA),PCA是一种常用的降维方法.这里对PCA算法做一个小笔记,并利用python完成对 ...

  8. OTSU算法学习 OTSU公式证明

    OTSU算法学习   OTSU公式证明 1 otsu的公式如下,如果当前阈值为t, w0 前景点所占比例 w1 = 1- w0 背景点所占比例 u0 = 前景灰度均值 u1 = 背景灰度均值 u = ...

  9. ISODATA聚类算法的matlab程序

    ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...

随机推荐

  1. WPF 打印界面(控件)到A4纸

    这次遇到一个需求,就是将整个界面打印在A4纸上. 需求清楚后,Bing一下关于打印,就找到一个类PrintDialog ,其中两个方法可能会用到: 特别是public void PrintVisual ...

  2. .NET MVC 学习笔记(七)— 控制input控件

    .NET MVC 学习笔记(七)— 控制input控件 画面中有时候需要输入数字,这时就需要控制input的输入.以下为保留两位有效数字. /* * 初始化数字输入 */ function initD ...

  3. 前端基础-html 列表标签,表格标签,表单标签

    一.列表标签 1.ul(无序列表)标签 ul(unordered list)无序列表,ul下的子元素只能是li(list item),如下示例: <ul> <li>第一项< ...

  4. redis ERR This instance has cluster support disabled

    Redis  集群的时候报错: redis.clients.jedis.exceptions.JedisDataException: ERR This instance has cluster sup ...

  5. iOS,Android,WP, .NET通用AES加密算法

    这两天为移动App开发API,结果实现加密验证时碰到一大坑.这里不得不吐槽下又臭又硬的iOS,Windows Server无法解密出正确的结果,Android则可以,后来使用了通用的AES256加密算 ...

  6. centos7搭建mysql5.7主从同步

    主从基本概念 mysql主从同步定义 主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave).因为复制是 ...

  7. 利用Makefile安装helloworld模块(速成)

    这学期对了一门操作系统,满怀着好奇装了虚拟机然后安了Ubuntu,这周作业是编译内核和安装个模块,妈耶,折腾了我一两天.终于弄完,CSDN上有挺多类似的教程,例如陈皓的跟我一起写Makefile,写的 ...

  8. Linux学习系列之一:在centos 7.5上安装nginx 以及简单配置

    说到Linux我们都知道那是相当相当得重要得啊,在计算机这个行业,开发运维都是离不开它得.我作为一个准毕业生,智商可能不太够,只能自己笨鸟先飞,自己操作起来咯.俗话说的好,好记性不如难笔头嘛.而且ng ...

  9. [工具]Cobalt Strike 3.13 TeamServer for Windows

    Cobalt Strike 3.13 TeamServer for Windows 0x001 环境 CS 3.12 或 3.13 Kali或Win最好安装jdk1.8.5或之后版本 设置环境变量,如 ...

  10. Vue2.5开发去哪儿网App 第三章笔记 下

    1.样式的绑定 我们可以传给 v-bind:class 一个对象,以动态地切换 class   例如: :class="{activated:isactivated}" 上面的语法 ...