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:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...
随机推荐
- SQL 修改数据库架构名
SQl 修改数据库架构名 declare @name sysname declare csr1 cursor for select TABLE_NAME from INFORMATION_SCHEMA ...
- vsftp 配置
安装和基本配置网上很多文章,但他们的最终效果不是我想要的: 我想要的是,ftp上传的文件用户可以通过apache的http服务访问,也就是ftp上传的文件可以通过浏览器访问,并且可以通过ftp客户端修 ...
- C++-高效的swap
原始版本: template<typename T> void swap(T& a, T& b) { T tmp(a); a = b; b = tmp; } 此版本不重视效 ...
- javax.servlet.ServletException: Error instantiating servlet class Compiler 错误
javax.servlet.ServletException: Error instantiating servlet class Compiler org.apache.catalina.authe ...
- jstl c:choose>、<c:when>和<c:otherwise>标签
<c:choose>.<c:when>和<c:otherwise>在一起连用,可以实现Java语言中的if-else语句的功能.例如以下代码根据username请求 ...
- C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)
强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整 ...
- [pjsip]Pjlib中的链表结构
Pjlib的链表结构跟常见的链表结构有所区别,如下图所示: 图1:一般链表结构 图2:pjlib中的链表结构 可以看到一般的双向链表是链表节点包含数据域,而pjlib中是数据域包含链表节点.一般的链表 ...
- hdu 2030
PS:原本这道题就空了好久...今天才去查了下汉字机内码... 然后才知道了. 1—— 一个汉字在字符串中是以两个负的字符形式存储,所以本题只要把字符串中负字符的个数找出来,再 除以2 就OK了. 2 ...
- Java中的接口与抽象类
抽象类很简单,就是多了个abstract关键字,可以有(也可以没有)只声明不定义的方法.不能实例化该类. 接口比较特殊: 无论你加不加public,接口中声明的方法都是public的,还有无论你加不加 ...
- Mifare Classic Tool(MCT)汉化版
2.0.4 到 2.0.6的更改: 注意:本汉化版本可能不稳定,与此发生的一切后果与作者和汉化者无关. Version : * Bugfix: Fixed crash which occurred i ...