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理论与实践的更多相关文章

  1. 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法

    若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...

  2. Java 理论与实践: 处理 InterruptedException

    捕捉到它,然后怎么处理它? 很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为 ...

  3. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

  4. Java 理论与实践: 流行的原子——新原子类是 java.util.concurrent 的隐藏精华(转载)

    简介: 在 JDK 5.0 之前,如果不使用本机代码,就不能用 Java 语言编写无等待.无锁定的算法.在 java.util.concurrent 中添加原子变量类之后,这种情况发生了变化.请跟随并 ...

  5. Java 理论和实践: 了解泛型

    转载自 : http://www.ibm.com/developerworks/cn/java/j-jtp01255.html 表面上看起来,无论语法还是应用的环境(比如容器类),泛型类型(或者泛型) ...

  6. Java 理论与实践: 处理 InterruptedException(转)

    很多 Java™ 语言方法,例如 Thread.sleep() 和 Object.wait(),都可以抛出InterruptedException.您不能忽略这个异常,因为它是一个检查异常(check ...

  7. DDD(领域驱动设计)理论结合实践

    DDD(领域驱动设计)理论结合实践   写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听 ...

  8. Java 理论与实践: 并发集合类

    Java 理论与实践: 并发集合类 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型 List 和 Map 的高性能的.线程安全的实现 ...

  9. 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM

    下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/slambook 第二讲:初识SLAM 2.4.2 Hello SLAM(书本P2 ...

随机推荐

  1. 【转】给npm设置代理

    可以运行如下两句命令设置代理,注意代理的地址改为自己实际可用的代理. npm config set proxy=http://127.0.0.1:8087 npm config set registr ...

  2. OC-数组排序-NSSortDescriptor使用

    OC-数组排序-NSSortDescriptor使用 在Object-c中,当有一个班级类MyClass,还有一个学生类Student.在班级类MyClass中通过一个可变数组NSMutableArr ...

  3. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  4. 《30天自制操作系统》16_day_学习笔记

    harib13a: 今天我们要继续折腾多任务,任务的高效管理是操作系统的一个重要的任务.在今天,我们将为系统创建更加完善的任务管理系统,其中包括优先级,任务等级等. 1.任务管理结构体 #define ...

  5. sdutoj 2610 Boring Counting

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2610 Boring Counting Time ...

  6. linux命令-sftp(模拟ftp服务)和scp(文件异地直接复制)

    1)sftp sftp是模拟ftp的服务,使用22端口 针对远方服务器主机 (Server) 之行为 变换目录到 /etc/test 或其他目录 cd /etc/testcd PATH 列出目前所在目 ...

  7. javaWeb 使用 filter 处理全站乱码问题

    1. web.xml文件中的配置 <filter> <filter-name>CharacterEncodingFilter</filter-name> <f ...

  8. apache svn subversion安装和配置(使用源码安装包方式)

    环境:虚拟机下centos7 1.下载安装包:http://subversion.apache.org/download.cgi 2.上传到指定文件夹并解压 3.安装依赖包 apr apr-utils ...

  9. php strrpos()与strripos()函数不同之处在哪里呢

    strripos() 函数 定义和用法strripos() 函数查找字符串在另一个字符串中最后一次出现的位置.如果成功,则返回位置,否则返回 false.语法strrpos(string,find,s ...

  10. win7下JDK环境变量设置方法

    来源于:http://jingyan.baidu.com/article/e9fb46e1b2b3347521f766c1.html