PCA理论与实践
PCA作用:
降维,PCA试图在力保数据信息丢失最少的原则下,用较少的综合变量代替原本较多的变量,而且综合变量间互不相关,减少冗余以及尽量消除噪声.
PCA的计算步骤:
假设样本观测数据矩阵为:
,
为n个样本在第i个属性上的观测值,是一个列向量
1.对原始数据标准化处理(0均值化处理)
2.计算样本相关系数矩阵
3.计算协方差矩阵的特征值和特征向量
4.选择重要的主成分,并写出主成分表达式
5.计算主成分得分
6.根据主成分得分的数据,做进一步的统计分析.
最大方差理论:
(1)、在信号处理中认为信号具有较大的方差,噪声具有较小的方差,信噪比就是信号与噪声的方差比,越大越好.因此,选择具有较大方差的特征值维度.
(2)、最小特征根接近于零,说明存在多重共线性问题
判断主成分的个数:
最常见的是基于特征值的方法,每个主成分都与相关系数矩阵的特征值
关联,第一主成分与最大的特征值相关联,第二主成分与第二大的特征值相关联,依此类推.
1、Kaiser-Harris准则建议保留特征值大于1的主成分,特征值小于1的成分所解释的方差比包含在单个变量中的方差更少.
2、Cattell碎石检验则绘制了特征值与主成分数的图形,这类图形可以展示图形弯曲状况,在图形变化最大处之上的主成分都保留.
3、可以进行模拟,依据与初始矩阵相同大小的随机数矩阵来判断要提取的特征值.若基于真实数据的某个特征值大于一组随机数据矩阵相应的平均特征值,那么该主成分可以保留.该方法称作平行分析.
优缺点:
优点:首先它利用降维技术用少数几个综合变量来代替原始多个变量,这些综合变量集中了原始变量的大部分信息.其次它通过计算综合主成分函数得分,对客观经济现象进行科学评价.再次它在应用上侧重于信息贡献影响力综合评价.
缺点:
1、在PCA中,首先应保证所提取的前几个主成分的累计贡献率达到一个较高的水平(即变量降维后的信息量须保持在一个较高水平上),其次对这些被提取的主成分必须都能够给出符合实际背景和意义的解释(否则主成分将空有信息量而无实际含义).
2、主成分的解释其含义一般多少带有点模糊性,不像原始变量的含义那么清楚、确切,这是变量降维过程中不得不付出的代价.因此,提取的主成分个数m通常应明显小于原始变量个数p(除非p本身较小),否则维数降低的“利”可能抵不过主成分含义不如原始变量清楚的“弊”.
#################R语言########################
法1:
data=USArrests
data<-scale(data)
#prcomp()####:主成分分析,通过奇异值分解做主成分分析,而不使用协方差矩阵的特征根;
dt<-princomp(data)####主成分分析 可以从相关阵或者从协方差阵做主成分分析;
summary(dt)####提取主成分信息 loadings=T显示主成分分析或因子分析中载荷的内容,提取主成分对应的特征向量;
loadings(dt)####载荷矩阵,查看每个变量对主成分的贡献度;
#predict()############3预测主成分的值;
screeplot(dt,type="lines")####画出主成分的碎石图;
biplot(dt)#######画出数据关于主成分的散点图和原坐标在主成分下的方向,双重信息图#################biplot,查看各个变量的表现.
法2(细节过程):
d=read.table("clipboard",header=T) #从剪贴板读取数据
sd=scale(d) #对数据进行标准化处理
d=read.table("clipboard",header=T) #从剪贴板读取标准化数据
pca=princomp(d,cor=T) #PCA函数
screeplot(pca,type="line",mian="碎石图",lwd=2) #画出碎石图
dcor=cor(d) #求相关矩阵
deig=eigen(dcor) #求相关矩阵的特征值和特征向量
deig$values #输出特征值
sumeigv=sum(deig$values)
sum(deig$values[1:2])/k #求前两个主成分的累积方差贡献率
pca$loadings[,1:2] #输出前2个主成分的载荷系数
deig$values[1]/k;deig$values[2]/k; #计算主成分C1、C2的系数b1、b2
C=(b1*C1+b2*C2)/(b1+b2)=q1*C1+q2*C2
s=pca$scores[,1:2] #输出前两个主成分的得分
c=s[1:评价对象的个数,1]*q1+s[1:评价对象的个数,2]*q2
cbind(s,c)
####################Python#########################
from numpy import *
- def loadDataSet(fileName,delim='\t'):
- fr=open(fileName)
- stringArr=[line.strip().split(delim) for line in fr.readlines]
- datArr=[map(float,line) for line in stringArr]
- return mat(datArr)
- def pca(dataMat,topNfeat=9999999):
- meanVals=mean(dataMat,axis=0)
- meanRemoved=dataMat-meanVals
- covMat=cov(meanRemoved,rowvar=0)
- eigVals,eigVects=linalg.eig(mat(covMat()))
- eigValInd=argsort(eigVals)
- eigValInd=eigValInd[:-(topNfeat+1):-1]
- redEigVects=eigVects[:,eigValInd]
- lowDDataMat=meanRemoved*redEigVects
- reconMat=(lowDDataMat*redEigVects.T)+meanVals
- return lowDDataMat,reconMat
PCA理论与实践的更多相关文章
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- Java 理论与实践: 处理 InterruptedException
捕捉到它,然后怎么处理它? 很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为 ...
- Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)
简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...
- Java 理论与实践: 流行的原子——新原子类是 java.util.concurrent 的隐藏精华(转载)
简介: 在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待.无锁定的算法.在 java.util.concurrent 中添加原子变量类之后,这种情况发生了变化.请跟随并 ...
- Java 理论和实践: 了解泛型
转载自 : http://www.ibm.com/developerworks/cn/java/j-jtp01255.html 表面上看起来,无论语法还是应用的环境(比如容器类),泛型类型(或者泛型) ...
- Java 理论与实践: 处理 InterruptedException(转)
很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为它是一个检查异常(check ...
- DDD(领域驱动设计)理论结合实践
DDD(领域驱动设计)理论结合实践 写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听 ...
- Java 理论与实践: 并发集合类
Java 理论与实践: 并发集合类 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型 List 和 Map 的高性能的.线程安全的实现 ...
- 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM
下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/slambook 第二讲:初识SLAM 2.4.2 Hello SLAM(书本P2 ...
随机推荐
- Sql Server 性能优化之包含列
导读:数据数优化查询一直是个比较热门的话题,小生在这方面也只能算是个入门生.今 天我们就讲下数据库包含列这个一项的作用及带来的优化效果 引用下MSDN里面的一段解释: 当查询中的所有列都作为键列或非键 ...
- cocos2dx 3.x(场景(层)的生命周期)
//进入当前层初第一步始化层调用 bool GameScence::init() { if( !void init() ) { returnfalse; } log("进入当前层初第一步始化 ...
- zjuoj 3602 Count the Trees
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3602 Count the Trees Time Limit: 2 Seco ...
- Fitnesse在eclipse中的调试
需要在Fitnesse的wik中添加: '''此句话专门用来Debug'''!define COMMAND_PATTERN {java -Xdebug -Xrunjdwp:transport=dt_s ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
- SQL中的charindex函数与reverse函数用法
----------------------首先介绍charindex函数----------------------------- ...
- WDR7500 花生壳问题
新进一WDR7500 居然不能解析花生壳. 百度一番, 发现别人有同样的问题. 找来找去从别人的只言片语中发现需要升级固件. 好不容易加入一个群, 把固件下下来. 升级固件, 重新设置, 解析成功. ...
- vs2013 类名颜色显示黑色,无法修改
vs2013 类名黑色,修改不起作用,最后找到解决办法. http://stackoverflow.com/questions/10970305/how-can-i-get-user-type-c-s ...
- mac上安装Navicat Premium 破解版+汉化包
Navicat是一款非常强大的sql分析管理工具.以前一直在windows上面使用. 由于工作的需要,我也是折腾出了这不易的mac破解版.下了好多网上的版本,亲测这个可用. 俗话说:工欲善其事,必先利 ...
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)
在更新项目之后,做了一定的改动后发现竟然报错了,刚才还好好的. java.sql.SQLException: Access denied for user 'root'@'localhost' (us ...