【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现










#encoding: UTF-8 ''' Created on 2016��12��14�� @author: YYH ''' import numpy as np from array import array # 自己实现参考 # http://blog.csdn.net/u012162613/article/details/42177327 # 传入的数据格式: array # 每一行代表一个样本 # 每一列代表一个唯度的信息 #数据中心化,使得各个维度的信息均为0 def meanshift(dataArr): mean = np.mean(dataArr,axis=0)#对每一列求均值 newData = dataArr-mean return newData,mean def zeroData(dataArr,mean): newData = dataArr-mean return newData class PCA: def __init__(self, n_components=1,percentage=0.99): self.dstDim = n_components self.reservePercentage = percentage def __del__(self): pass def fit(self,dataArr): zeroMeanData,meanVal = meanshift(dataArr) self.meanVal = meanVal#保存数据中心 # 求协方差矩阵,rowvar = 0:一行代表一个样本 cov = np.cov(zeroMeanData,rowvar=0) #求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量 eigVals,eigVector =np.linalg.eig(cov) eigValsIndice = np.argsort(eigVals)#从小到大排列 n_eigValsIndice = eigValsIndice[-1:-(self.dstDim+1):-1] #最大的n个特征的下标 n_eigVect = eigVector[:,n_eigValsIndice]#最大的n个特征值对应的特征向量 n_eigVect = np.matrix(n_eigVect) self.n_eigVect = n_eigVect #保存特征向量 def fit_transform(self,dataArr): zeroMeanData,meanVal = meanshift(dataArr) self.meanVal = meanVal#保存数据中心 # 求协方差矩阵,rowvar = 0:一行代表一个样本 cov = np.cov(zeroMeanData,rowvar=0) #求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量 eigVals,eigVector =np.linalg.eig(cov) eigValsIndice = np.argsort(eigVals)#从小到大排列 n_eigValsIndice = eigValsIndice[-1:-(self.dstDim+1):-1] #最大的n个特征的下标 n_eigVect = eigVector[:,n_eigValsIndice]#最大的n个特征值对应的特征向量 zeroMeanData = np.matrix(zeroMeanData) n_eigVect = np.matrix(n_eigVect) self.n_eigVect = n_eigVect #保存特征向量 lowDData = zeroMeanData*n_eigVect #低维特征空间的数据 # reConData = (lowDData*n_eigVect.T)+meanVal #重构数据 return lowDData def transform(self,dataArr): zeroMeanData = zeroData(dataArr,self.meanVal) zeroMeanData = np.matrix(zeroMeanData) lowDData = zeroMeanData*self.n_eigVect #低维特征空间的数据 # reConData = (lowDData*n_eigVect.T)+meanVal #重构数据 return lowDData
【代码验证】
在做手写数字识别时,我分别使用了sklearn的PCA,和自己整理的PCA,达到的准确度都到了96%左右。
在PCA降维后的数据来看,可能在特征向量上方向不同,导致部分列跟sklearn的符号相反
时间上,可能自己整理实现的PC A现在耗时短点,毕竟目前是比较简单的PC A
【统计学习】主成分分析PCA(Princple Component Analysis)从原理到实现的更多相关文章
- R: 主成分分析 ~ PCA(Principal Component Analysis)
本文摘自:http://www.cnblogs.com/longzhongren/p/4300593.html 以表感谢. 综述: 主成分分析 因子分析 典型相关分析,三种方法的共同点主要是用来对数据 ...
- 用scikit-learn学习主成分分析(PCA)
在主成分分析(PCA)原理总结中,我们对主成分分析(以下简称PCA)的原理做了总结,下面我们就总结下如何使用scikit-learn工具来进行PCA降维. 1. scikit-learn PCA类介绍 ...
- 解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程(转载)
KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...
- 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程
KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...
- PCA(Principal Component Analysis)笔记
PCA是机器学习中recognition中的传统方法,今天下午遇到了,梳理记一下 提出背景: 二维空间里,2个相近的样本,有更大概率具有相同的属性,但是在高维空间里,由于样本在高维空间里,呈现越来越稀 ...
- 主成分分析(principal components analysis, PCA)——无监督学习
降维的两种方式: (1)特征选择(feature selection),通过变量选择来缩减维数. (2)特征提取(feature extraction),通过线性或非线性变换(投影)来生成缩减集(复合 ...
- 《principal component analysis based cataract grading and classification》学习笔记
Abstract A cataract is lens opacification caused by protein denaturation which leads to a decrease i ...
- 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA
本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...
- 【机器学习】--主成分分析PCA降维从初识到应用
一.前述 主成分分析(Principal Component Analysis,PCA), 是一种统计方法.通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分. ...
随机推荐
- MySQLdb的一些经验
遇到过的几类问题: 如果保持长连接,即使在mysql数据库默认的connection timeout内,也有可能出现"mysql server has gone away".还有另 ...
- STL
STL qsort intcompare(constvoid*arg1,constvoid*arg2){ return(*(int*)arg1<*(int*)arg2)?-1: (*(int*) ...
- WebService入门
1.什么是web服务: web服务是一种可以用来解决跨网络应用集成问题的开发模式,这种模式为实现"软件即服务"提供了技术保障. 2.web服务的三个核心 2.1 SOAP SOA ...
- Cocos2d-JS/Ajax用Protobuf与NodeJS/Java通信
原文地址:http://www.iclojure.com/blog/articles/2016/04/29/cocos2d-js-ajax-protobuf-nodejs-java Google的Pr ...
- java基础知识(六)日期处理
一.日期处理类 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串.不过,这些函数的 API 不易于实现国际化.从 ...
- Bootstrap table使用心得
序号显示带分页信息的连续编号,在序号列添加以下格式化代码即可. { field: 'number', title: '序号', align:'center', width:45, formatter: ...
- android 选择图片或拍照时旋转了90度问题
由于前面的博文中忽略了点内容,所以在这里补上,下面内容就是解决拍照或者选择图片显示的时候图片旋转了90度或者其他度数问题,以便照片可以正面显示:具体如下: 首先直接看上面博文下的拍完照或者选完图后处理 ...
- MySQL复制和集群
一.复制配置 (A) 主从服务器相同版本的数据库 (B) 主服务器上复制使用的账户,具有相应的权限. (C) 修改主服务器的配置文件my.cnf,开启BINLOG,并设置server-id的值.重启后 ...
- MarkdownPad 2 在win10下出错:HTML 渲染错误(This view has crashed) 的解决办法 + MarkdownPad2.5 注册码
首先附上MarkdownPad2.5的注册码. 邮箱:Soar360@live.com 授权密钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImD ...
- C#string类型总结
字符串的特性:不可变性,每对字符串做拼接或者重新赋值之类的操作,都会在内存中产生一个新的实例. 所以说,在.Net平台下,如果你对一个字符串进行大量的拼接赋值等操作,会产生大量的垃圾. --- ...