【统计学习】主成分分析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), 是一种统计方法.通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分. ...
随机推荐
- C#操作access和SQL server数据库代码实例
在C#的学习中,操作数据库是比较常用的技术,而access和sql server 数据库的操作却有着不同.那么,有哪些不同呢? 首先,需要引用不同的类.因为有着不同的数据引擎. access:usin ...
- opengl es中不同的绘制方式
opengl es中不同的绘制方式 转载请保留出处:http://xiaxveliang.blog.163.com/blog/static/297080342013467344263/ 1. GL_P ...
- java 持久框架mybatis的初步学习
什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索.MyBati ...
- Winform的"透明"
手头目前的一个项目(.Net4.0)中有这样一个需求:在程序中要进行视频采集,并且要在视频影像区域进行绘图编辑,对绘图能进行拉伸,拖拽和删除.从需求来看,必须得在视频影像区的上方盖一层画布才能这么操作 ...
- 记录NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END。
Nonnull区域设置(Audited Regions) 如果需要每个属性或每个方法都去指定nonnull和nullable,是一件非常繁琐的事.苹果为了减轻我们的工作量,专门提供了两个宏:NS_AS ...
- Mac上搭建Nginx + rtmp
介绍 nginx是非常优秀的开源服务器,用它来做hls或者rtmp流媒体服务器是非常不错的选择,本人在网上整理了安装流程,分享给大家并且作备忘. 安装步骤 1.先安装brew: /usr/bin/ru ...
- .net MVC 简单图片上传
主要完成的是在网页上 上传一张图片到服务器 我搜出来的上传文件代码都特别复杂,对于初学者来说,先解决能上传的问题才最重要,并不需要特别多的功能,仅适合不会上传的初学者,大神请绕路,错误请指出,谢谢 v ...
- oracleDBA-D4
1.数据字典: 创建和维护的可修改的系统表..它存放有关数据库和数据库对象的信息. 数据字典=基表+字典视图 2.数据字典所存放的信息: 数据库的逻辑和物理结构(如:表空间和数据文件),数据对象定义的 ...
- js,jq,css选择器
js获取节点: var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode; //得到s的父节点 var ns=s.nextSbiling; / ...
- hdu 5384 Danganronpa
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 思路:没学自动机时以为是道KMP然后就tle了好几把,AC自动机模板题 #include<cs ...