PCV 学习笔记-ch1 主成分分析实现
模块名称:pca.py
PCA原理与紧致技巧原理待补。。。
#-*-coding:UTF-8-*-
'''
Created on 2015年3月2日
@author: Ayumi Phoenix ch01 p-14 图像的主成分分析
''' from PIL import Image
import numpy def pca(X):
"""主成分分析:
输入;矩阵X 每一行为一条训练数据
返回:投影矩阵(按照维度重要性排序),方差,和均值"""
X = numpy.asarray(X)
n_data,dim = X.shape # axis_0, axis_1 mean_X = X.mean(axis=0)
X -= mean_X if n_data < dim:
# 维数大于样本数,使用紧致技巧
R_sigma = numpy.dot(X,X.T) # m x m
eign_values, eign_vectors = numpy.linalg.eigh(R_sigma) # 返回H矩阵或对称阵的特征值和特征向量(递增顺序)
tmp = numpy.dot(X.T,eign_vectors) # (n2,m) x (m,m)
V = tmp[::-1] # 矩阵V每行向量都是正交的
S = numpy.sqrt(eign_values)
for i in xrange(V.shape[1]):
V[:,i] /= S
else:
# PCA - SVD
U,S,V = numpy.linalg.svd(X)
V = V[:n_data] # 仅仅返回前n_data维数据才合理 # 返回投影向量矩阵, 特征值开方, 均值
return V, S, mean_X if __name__=="__main__":
from PIL import Image
import numpy
import pylab
import imtools as imt path = r"E:\dataset lib\PCV_data\fontimages\a_thumbs"
imlist = imt.get_imlist(path)
im = numpy.array(Image.open(imlist[0]))
m,n = im.shape[0:2]
n_im = len(imlist) im_matrix = numpy.array([numpy.array(Image.open(each_im)).flatten()
for each_im in imlist],'f') V,S,im_mean = pca(im_matrix)
# 显示均值图像与前七个特征图
pylab.figure()
pylab.gray()
pylab.subplot(2,4,1)
pylab.imshow(im_mean.reshape(m,n))
for i in xrange(7):
pylab.subplot(2,4,i+2)
pylab.imshow(V[i].reshape(m,n)) # 从新投影为新样本
k = 10
print im_matrix.shape,V.shape
# 取V前k个特征向量
y = numpy.dot(im_matrix,V[0:k,:].T) # (m,n2) * ((k,n2).T) = [m,k]
print y.shape
# 显示还原图像
im_matrix_tidle = numpy.dot(y,V[0:k,:]) + im_mean
pylab.figure()
pylab.gray()
for i in xrange(8):
pylab.subplot(2,4,i+1)
pylab.imshow(im_matrix_tidle[i].reshape(m,n)) pylab.show() # 保存均值和主成分数据
import pickle
f = open('font_pca_models.pkl','wb')
pickle.dump(im_mean, f)
pickle.dump(V, f)
f.close() # 载入均值和主成分数据
import pickle
f = open('font_pca_models.pkl','rb')
im_mean = f.load(f) # 载入对象顺序必须和保存顺序一样
V = f.load(f)
f.close()
均值图片与前7个特征向量:

前7张图片降维后的还原图像

PCV 学习笔记-ch1 主成分分析实现的更多相关文章
- Neural Networks and Deep Learning学习笔记ch1 - 神经网络
近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的. ...
- Go语言并发与并行学习笔记(一)
转:http://blog.csdn.net/kjfcpua/article/details/18265441 如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人. Go语言从语言层面上就 ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Hadoop学习笔记(5) ——编写HelloWorld(2)
Hadoop学习笔记(5) ——编写HelloWorld(2) 前面我们写了一个Hadoop程序,并让它跑起来了.但想想不对啊,Hadoop不是有两块功能么,DFS和MapReduce.没错,上一节我 ...
- Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)
1.File类:对硬盘上的文件和目录进行操作的类. File类是文件和目录路径名抽象表现形式 构造函数: 1) File(String pathname) Creat ...
- Deep Learning深入研究整理学习笔记五
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记01--数据类型
java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...
- 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...
随机推荐
- 封装自己的JS库
一.基础知识 1.点击计数 第一种: var aBtn=document.getElementsByTagName('input'); var i=0; for(i=0;i<aBtn.lengt ...
- HDU 3085 Nightmare II 双向bfs 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...
- 长理ACM 7-密码破译(闫博钊)
/* //题目标题: *密码破译(闫博钊) //题目描述: *某组织欲破获一个外星人的密码,密码由一定长度的字串组成.此组织拥有一些破译此密码的长度不同的钥匙,若两个钥匙的长度之和恰好为此密码的长度, ...
- WP8.1 Study3:WP8.1中Animation应用
WP8.1上的Animation动画的API和WIN8/WIN8.1上的差不多,网上可以找到很多资料,同时可以去MSDN看官方文档. 下面是我参考一些资料,写出来的例子,希望以后有用. xaml代码如 ...
- Jquery easyui datagrid 导出Excel
From:http://www.cnblogs.com/weiqt/articles/4022399.html datagrid的扩展方法,用于将当前的数据生成excel需要的内容. 1 <sc ...
- redis2.8--c/s架构流程
- jpcap
1.System.out.println( System.getProperty("java.library.path")); 2.将jpcap.dll放到上边打印的路径中
- sql 给数据库表 字段 添加注释
最近发现一些代码生成器 有针对注释做一个很好的转化,之前建表的时候 没有这块的注释.现在想增加,专门去看了下 如何增加注释 1 -- 表加注释 2 EXEC sys.sp_addextendedpro ...
- MATLAB图像处理函数汇总(一)
1.applylut功能: 在二进制图像中利用lookup表进行边沿操作.语法:A = applylut(BW,lut)举例lut = makelut('sum(x(:)) == 4',2);BW1 ...
- ODI中查看变更及对象查找
ODI中可以查看每个对象的修改时间.修改人,当ETL作业失败之后,可以根据这些信息了解到是否有人修改过相关的对象. 另外,在ODI的菜单项中,也可以查看按修改时间.人员等搜索指定的对象,如查找最近7天 ...