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:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...
随机推荐
- 小记:获取系统时间的long值,格式化成可读时间。
/** * 返回的字符串形式是形如:2013年10月20日 20:58 * */ public static String formatTimeInMillis(long timeInMillis) ...
- C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)
准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...
- js字符转换成整型 parseInt()函数规程Number()函数
今天在做一个js加法的时候,忘记将字符转换成整型,导致将加号认为是连接符, 在运算前要先对字符井行类型转换,使用parseInt()函数 使用Number()将字符转换成int型效果更好
- tableview_nav 动画效果
-(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat yOffset = scrollView.contentOffset. ...
- Cisco IOS Security command Guide
copy system:running-config nvram:startup-config : to save your configuration changes to the startup ...
- 【转发】CentOS 7 巨大变动之 systemd 取代 SysV的Init
1 systemd是什么 首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序. ...
- maven的简单安装与配置
什么是Maven? Maven可以被理解成"知识的积累",也可以被翻译为"专家".它是一个项目管理工具. 它的主要服务即源于java平台的项目构建.依赖管理和项 ...
- flash 和 第三方程序交互
一.flash 端 修改 1.flash cs6 修改脚本 为as3 2.修改 按钮 实例 名 (不是sprite列表中的名字 实例名称 和这个名字 是2个) 3.时间轴上 添加代码 当前选择 A ...
- sql学习资料
http://blog.sina.com.cn/s/articlelist_1594135432_9_1.html
- sql server和oracle的差异
.部分SQL语句差异 (1)SQL:select top 10 * from table ORA: select * from table where rownum<11(2)SQL:S ...