[综] PCA降维
http://blog.json.tw/using-matlab-implementing-pca-dimension-reduction
設有m筆資料, 每筆資料皆為n維, 如此可將他們視為一個mxn matrix。若資料的維度太大時, 可能不利於分析, 例如這m筆資料用作機器學習。
PCA的想法是算出這mxn matrix的斜方差矩陣, 此矩陣大小為nxn, 計算此矩陣n個特徵值(eigen value)及其對應的特徵向量(eigen vector), 依eigen value大小由小到大排列其對應的eigen vector, 取出前幾個eigen vector假設為k個(k< n), 如此製造出一個矩陣nxk。原來資料的矩陣乘上此矩陣可得到mxn x nxk = mxk 大小之矩陣, 達到降維的效果, 以較低維度表示高維度的空間。
至於k值要取到多少降到幾維? 降的維度越低, 能表達原空間的程度越有限, 通常取到能夠表達到原來空間程度95%以上的維度, 至於表達程度的計算方式如下, 舉例若降到k維, 則能表達原空間的程度百分比為:
eigenvalue前k項和 / eigenvalue總和
假設eigen value為
517.7969
67.4964
12.4054
0.2372
則取k=1~4分別能夠表達原來空間的程度為
0.86597
0.97886
0.9996
1
A mxn matrix
使用PCA降維
[eigenVector,score,eigenvalue,tsquare] = princomp(matrix);
eigenVector與eigenvalue皆已排序, 若要降到k維, 取轉換矩陣
transMatrix = eigenVector(:,1:k);
取新的 matrix = matrix * transMatrix
http://blog.sina.com.cn/s/blog_616d4c030102vcz6.html
PCA的原理就是将原来的样本数据投影到一个新的空间中,相当于我们在矩阵分析里面学习的将一组矩阵映射到另外的坐标系下。通过一个转换坐标,也可以理解成把一组坐标转换到另外一组坐标系下,但是在新的坐标系下,表示原来的原本不需要那么多的变量,只需要原来样本的最大的一个线性无关组的特征值对应的空间的坐标即可。
比如,原来的样本是30*1000000的维数,就是说我们有30个样本,每个样本有1000000个特征点,这个特征点太多了,我们需要对这些样本的特征点进行降维。那么在降维的时候会计算一个原来样本矩阵的协方差矩阵,这里就是1000000*1000000,当然,这个矩阵太大了,计算的时候有其他的方式进行处理,这里只是讲解基本的原理,然后通过这个1000000*1000000的协方差矩阵计算它的特征值和特征向量,最后获得具有最大特征值的特征向量构成转换矩阵。比如我们的前29个特征值已经能够占到所有特征值的99%以上,那么我们只需要提取前29个特征值对应的特征向量即可。这样就构成了一个1000000*29的转换矩阵,然后用原来的样本乘以这个转换矩阵,就可以得到原来的样本数据在新的特征空间的对应的坐标。30*1000000 * 1000000*29 = 30 *29, 这样原来的训练样本每个样本的特征值的个数就降到了29个。
下面是百度百科中对pca降维的一段解释,还是挺清晰的:
“对于一个训练集,100个对象模板,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵,然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个特征的维数下降了。
matlab 中关于PCA的几个函数:
princomp在新版本中会被pca替换
如果已知协方差矩阵,用函数pcacov来计算。
使用matlab对训练样本图像降维,并对测试图像使用变换矩阵降维并重构
http://blog.163.com/yuyang_tech/blog/static/2160500832013543350874
给出了很好的例子。
clear;
clc;
train_path='E:\TrainingSet\angry\positive\';
images = dir('E:\TrainingSet\angry\positive\*.bmp');
phi=zeros(30,64*64);
% 加载样本图像到 30*(64*64)的矩阵中,每一行代表一幅图像
for i=1:30
path=strcat(train_path,images(i).name);
Image=imread(path);
Image=imresize(Image,[64,64]);
phi(i,:)=double(reshape(Image,1,[]));
end;
% 计算平均脸,并保存用以查看
mean_phi=mean(phi,1);
mean_face=reshape(mean_phi,64,64);
Image_mean=mat2gray(mean_face);
imwrite(Image_mean,'meanface2.bmp','bmp');
% 使用matlab自带的pca进行降维
[coeff, score, latent, TSQUARED] = princomp(phi,'econ');
%display Eigenface
for i=1:29
Eigenface=reshape(coeff(:,i),[64,64]);
figure(i);
imshow(mat2gray(Eigenface));
end
% 进行测试
%使用测试样本进行测试
clc;
test_path='E:\BIT\code\FER\meanface.bmp';
error=zeros([1,4]);
Image=imread(test_path);
Image=double(imresize(Image,[64,64]));
phi_test=zeros(1,64*64);
phi_test(1,:)=double(reshape(Image,1,[])); % 读入的测试图像保存为一行,行向量
X_test=phi_test-mean_phi;
Y_test=X_test*coeff;
X_test_re=Y_test*coeff';
Face_re=X_test_re+mean_phi;
%calculate error rate
e=Face_re-phi_test;
%%display figure
Face_re_2=reshape(Face_re(1,:),[64,64]);
figure(i);
imshow(mat2gray(Image));
title('Original');
figure(10+i);
imshow(mat2gray(Face_re_2));
title('Reconstruct');
error(1,i)=norm(e);
%dispaly error rate
error_rate=error(1,i);
display(error_rate);
[综] PCA降维的更多相关文章
- 机器学习公开课笔记(8):k-means聚类和PCA降维
K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis ...
- Python机器学习笔记 使用scikit-learn工具进行PCA降维
之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-learn工具来进行PCA降维. 在数据处理中,经常会遇到特征维度比样本数量多得多 ...
- PCA降维—降维后样本维度大小
之前对PCA的原理挺熟悉,但一直没有真正使用过.最近在做降维,实际用到了PCA方法对样本特征进行降维,但在实践过程中遇到了降维后样本维数大小限制问题. MATLAB自带PCA函数:[coeff, sc ...
- 一步步教你轻松学主成分分析PCA降维算法
一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...
- 【资料收集】PCA降维
重点整理: PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法 1.原始数据: 假定数据是二维的 x=[2.5, 0.5, 2.2, 1. ...
- 第四章 PCA降维
目录 1. PCA降维 PCA:主成分分析(Principe conponents Analysis) 2. 维度的概念 一般认为时间的一维,而空间的维度,众说纷纭.霍金认为空间是10维的. 3. 为 ...
- PCA 降维算法详解 以及代码示例
转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analys ...
- [学习笔记] numpy次成分分析和PCA降维
存个代码,以后参考. numpy次成分分析和PCA降维 SVD分解做次成分分析 原图: 次成分复原图: 代码: import numpy as np from numpy import linalg ...
- 关于PCA降维中遇到的python问题小结
由于论文需要,开始逐渐的学习CNN关于文本抽取的问题,由于语言功底不好,所以在学习中难免会有很多函数不会用的情况..... ̄へ ̄ 主要是我自己的原因,但是我更多的把语言当成是一个工具,需要的时候查找就 ...
随机推荐
- uboot(二): Uboot-arm-start.s分析
声明:该贴是通过参考其他人的帖子整理出来,从中我加深了对uboot的理解,我知道对其他人一定也是有很大的帮助,不敢私藏,如果里面的注释有什么错误请给我回复,我再加以修改.有些部分可能还没解释清楚,如果 ...
- WPF与WinForm开发有什么区别?
转自http://hi.baidu.com/leoliu83/blog/item/1d1a4a66dcb41134aa184cfd.html WPF开发于WinForm之后,从技术发展的角度,WPF比 ...
- Eclipse默认空间与工作空间的更改(转)
一.更改eclipse默认空间 进行 eclipse 目录下的 configuration 目录, 打开config.ini文件 将 osgi.instance.area.default= 项修改成你 ...
- mysql 信息查询
show tables information 除了查询数据,管理数据之外,还有其他方面的信息方便和约束着 -- show information about characterset,查询mys ...
- python requests 模块初探
现在经常需要在网页中获取相关内容. 其中无非获取网页返回状态,以及查看网页获取的内容几个方面,那么在这方面来看requests可能比urllib2库更简便一些. 比如:先用方法获取网页 r = req ...
- Hyper-V安装Oracle Linux6_4 Oracle db 12c并使用rman做异机恢复
本文记录在Windows Server 2012 R2上安装Oracle Enterprise Linux 6.4以及使用RMAN进行进行异机恢复的过程. Windows服务器增加Hyper-V功能 ...
- 苹果Home键恢复(无工具篇)
无工具法: 弹指神功.用手指轻轻弹Home,过了一阵子后可能会出现白色污垢,其后再重覆“弹”,直至正常为止.(亲测可用) 软件调试法.首先,打开任意一款应用程序,按住电源开关几秒钟,直到屏幕出现滑动关 ...
- html、url、http、servlet&jsp之间千丝万缕的联系
html.url.http.servlet和jsp这五者一直是五位一体的关系,他们结合在一起就是对面向过程最好的解释. 客户端通过http超文本传输协议传输请求,服务器通过地址栏的url判断应该交给哪 ...
- React(JSX语法)-----JSX基本语法
JSX------HTML tags vs React Components: 1.To render a html tag,just use lower-case tag names in JSX; ...
- java程序链接到sql server数据库
package jianhua; import java.sql.*; public class ConDatabase { public static void main(String[] args ...