Python 主成分分析PCA

Python 主成分分析PCA

  主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k<n),这k维特征称为主元,是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的k个特征互不相关。

相关知识

介绍一个PCA的教程:A tutorial on Principal Components Analysis ——Lindsay I Smith

1.协方差 Covariance

  变量X和变量Y的协方差公式如下,协方差是描述不同变量之间的相关关系,协方差>0时说明 X和 Y是正相关关系,协方差<0时 X和Y是负相关关系,协方差为0时 X和Y相互独立。

  

  协方差的计算是针对两维的,对于n维的数据集,可以计算C(n,2)种协方差。 n维数据的协方差矩阵的定义如下:
  
      Dim(x)表示第x维。

      对于三维(x,y,z),其协方差矩阵如下,可看出协方差矩阵是一个对称矩阵(symmetrical),其对角线元素为每一维的方差:
    

2.特征向量和特征值 

  若,则称是A的特征值,X是对应的特征向量。可以这样理解:矩阵A作用在它的特征向量X上,仅仅使得X的长度发生了变化,缩放比例就是相应的特征值。特征向量只能在方阵中找到,而且并不是所有的方阵都有特征向量,并且如果一个n*n的方阵有特征向量,那么就有n个特征向量。一个矩阵的所有特征向量是正交的,即特征向量之间的点积为0,一般情况下,会将特征向量归一化,即向量长度为1。

3.PCA过程

  第一步,获取数据,下图中的Data为原始数据,一共有两个维度,可看出二维平面上的点。

  

  下图是Data在二维坐标平面上的散点图:

  

  第二步,减去平均值,对于Data中的每一维数据分别求平均值,并减去平均值,得到DataAdjust数据。

  第三步,计算DataAdjust的协方差矩阵

  

  第四步,计算协方差矩阵的特征向量和特征值,选取特征向量

  
   

  特征值0.490833989对应的特征向量是(-0.735178656, 0.677873399),这里的特征向量是正交的、归一化的,即长度为1。

  下图展示DataAdjust数据和特征向量的关系:

  

  正号表示预处理后的样本点,斜着的两条线就分别是正交的特征向量(由于协方差矩阵是对称的,因此其特征向量正交),特征值较大的那个特征向量是这个数据集的主要成分(principle component)。通常来说,当从协方差矩阵计算出特征向量之后,下一步就是通过特征值,对特征向量进行从大到小的排序,这将给出成分意义的顺序。成分的特征值越小,其包含的信息量也就越少,因此可以适当选择。  

  如果数据中有n维,计算出n个特征向量和特征值,选择前k个特征向量,然后最终的数据集合只有k维,取的特征向量命名为FeatureVector。 

     

  这里特征值只有两个,我们选择其中最大的那个,1.28402771,对应的特征向量是clip_image009[6]

  第五步,将样本点投影到选取的特征向量上,得到新的数据集

  假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为

       clip_image011[4] 

  这里是FinalData(10*1) = DataAdjust(10*2矩阵)×特征向量clip_image009[7]

  得到结果为

  clip_image012[4]

  下图是FinalData根据最大特征值对应的特征向量转化回去后的数据集形式,可看出是将DataAdjust样本点分别往特征向量对应的轴上做投影:

  

  如果取的k=2,那么结果是

     clip_image014[4]

  可见,若使用了所有特征向量得到的新的数据集,转化回去之后,与原来的数据集完全一样(只是坐标轴旋转)。

Python实现PCA

  将数据转化成前K个主成分的伪码大致如下: 

复制代码
'''
减去平均数
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最大的K个特征向量
将数据转换到上述K各特征向量构建的新空间中
'''
复制代码

  代码实现如下:

复制代码
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=999999):meanVals = mean(dataMat, axis=0)DataAdjust = dataMat - meanVals           #减去平均值covMat = cov(DataAdjust, rowvar=0)eigVals,eigVects = linalg.eig(mat(covMat)) #计算特征值和特征向量#print eigValseigValInd = argsort(eigVals)eigValInd = eigValInd[:-(topNfeat+1):-1]   #保留最大的前K个特征值redEigVects = eigVects[:,eigValInd]        #对应的特征向量lowDDataMat = DataAdjust * redEigVects     #将数据转换到低维新空间reconMat = (lowDDataMat * redEigVects.T) + meanVals   #重构数据,用于调试return lowDDataMat, reconMat
复制代码

  测试数据testSet.txt由1000个数据点组成。下面对数据进行降维,并用matplotlib模块将降维后的数据和原始数据一起绘制出来。

复制代码
import matplotlib
import matplotlib.pyplot as pltdataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat,1)
print "shape(lowDMat): ",shape(lowDMat)fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90)
ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()
复制代码

  结果如下图:

Python环境

1.编译环境:win8.1 + 32位 + python2.7

2.相关模块安装:

  (1)Numpy和Scipy:numpy用于存储和处理大型矩阵,进行数值计算。scipy是基于numpy的科学和工程计算工具,用于处理多维数组向量、矩阵、图形(图形图像是像素的二维数组)、表格。下载地址:http://www.scipy.org/scipylib/download.html

  (2)Matplotlib:python的一个图形框架,用于数据绘图。win32的安装文件下载地址:http://matplotlib.org/downloads.html

  (3)Dateutil 和 Pyparsing模块:安装配置matplotlib包时需要。win32的安装文件下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/

3.编译遇到问题:

  (1)提示“No module name six”,将\Python27\Lib\site-packages\scipy\lib中的six.py six.pyc six.pyo三个文件拷贝到\Python27\Lib\site-packages目录下即可。

  (2)提示 “ImportError: six 1.3 or later is required; you have 1.2.0”,说明six.py版本过低,下载最新的版本,将其中的six.py替换\Python27\Lib\site-packages中的six.py即可,下载地址:https://pypi.python.org/pypi/six/

  注:six模块是Python 2和3的兼容工具

 

PCA可以从数据中识别其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。其中的矩阵运算,求特征值、特征向量等不是很熟悉,仍需进一步学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 国际化_在国际化您的应用程序时忘记的一件事

小程序 国际化The hidden bugs waiting to be found by your international users您的国际用户正在等待发现的隐藏错误 While internationalizing our applications, we focus on the things we can see: text, tool-tips, error messages, and the like. But, hidden in our …

三. 性能测试领域

能力验证&#xff1a; 概念&#xff1a;系统能否在A条件下具备B能力 应用&#xff1a;为客户进行系统上线后的验收测试&#xff0c;作为第三方对一个已经部署系统的性能验证 特点&#xff1a;需要在已确定的环境下运行 需要根据典型场景设计测试方案和用例 一个典型场景包括操…

PCA主成分分析Python实现

作者&#xff1a;拾毅者 出处&#xff1a;http://blog.csdn.net/Dream_angel_Z/article/details/50760130 Github源码&#xff1a;https://github.com/csuldw/MachineLearning/tree/master/PCA PCA&#xff08;principle component analysis&#xff09; &#xff0c;主成分分…

scp

将文件或目录从本地通过网络拷贝到目标端。拷贝目录要带 -r 参数 格式&#xff1a;scp 本地用户名IP地址:文件名1 远程用户名IP地址:文件名 2 例&#xff1a; scp media.repo root192.168.20.32:/etc/yum.repos.d/ 将远程主机文件或目录拷贝到本机&#xff0c;源和目的参数调换…

robo 3t连接_使用robo 3t studio 3t连接到地图集

robo 3t连接Robo 3T (formerly Robomongo) is a graphical application to connect to MongoDB. The newest version now includes support for TLS/SSL and SNI which is required to connect to Atlas M0 free tier clusters.Robo 3T(以前称为Robomongo )是用于连接MongoDB的…

JavaWeb--JavaEE

一、JavaEE平台安装1、升级eclipseEE插件2、MyEclipse二、配置Eclipse工作空间1.字体设置 2.工作空间编码 UTF-83.JDK版本指定 4.集成Tomcat Server运行环境5.配置server webapps目录 端口号 启动时间等三、创建第一个Web项目1.创建 Web Project2.设置 tomcat、创建web.xml3.目…

软件需求规格说明书通用模版_通用需求挑战和机遇

软件需求规格说明书通用模版When developing applications there will be requirements that are needed on more than one application. Examples of such common requirements are non-functional, cookie consent and design patterns. How can we work with these types of…

python版PCA(主成分分析)

python版PCA&#xff08;主成分分析&#xff09; 在用统计分析方法研究这个多变量的课题时&#xff0c;变量个数太多就会增加课题的复杂性。人们自然希望变量个数较少而得到的信息较多。在很多情形&#xff0c;变量之间是有一定的相关关系的&#xff0c;当两个变量之间有一定…

干货|Spring Cloud Bus 消息总线介绍

2019独角兽企业重金招聘Python工程师标准>>> 继上一篇 干货&#xff5c;Spring Cloud Stream 体系及原理介绍 之后&#xff0c;本期我们来了解下 Spring Cloud 体系中的另外一个组件 Spring Cloud Bus (建议先熟悉 Spring Cloud Stream&#xff0c;不然无法理解 Spr…

一类动词二类动词三类动词_基于http动词的完全无效授权技术

一类动词二类动词三类动词Authorization is a basic feature of modern web applications. It’s a mechanism of specifying access rights or privileges to resources according to user roles. In case of CMS like applications, it needs to be equipped with advanced l…

主成份分析(PCA)详解

主成分分析法&#xff08;Principal Component Analysis&#xff09;大多在数据维度比较高的时候&#xff0c;用来减少数据维度&#xff0c;因而加快模型训练速度。另外也有些用途&#xff0c;比如图片压缩&#xff08;主要是用SVD&#xff0c;也可以用PCA来做&#xff09;、因…

thinkphp5记录

ThinkPHP5 隐藏index.php问题 thinkphp模板输出cookie,session中… 转载于:https://www.cnblogs.com/niuben/p/10056049.html

portainer容器可视化管理部署简要笔记

参考链接&#xff1a;https://www.portainer.io/installation/ 1、单个宿主机部署in Linux&#xff1a;$ docker volume create portainer_data$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer 2、单…

证明您履历表经验的防弹五步法

How many times have you gotten the question “Tell me more about your work experience at …” or “Describe an experience when you had to overcome a technical challenge”? Is your answer solid and bullet-proof every single time you have to respond? If no…

2018-2019-1 20165231 实验四 外设驱动程序设计

博客链接&#xff1a;https://www.cnblogs.com/heyanda/p/10054680.html 转载于:https://www.cnblogs.com/Yhooyon/p/10056173.html

如何安装pylab:python如何导入matplotlib模块

pylab是python下挺不错的一个画图模块&#xff0c;使用也非常简单&#xff0c;记得Mit的计算机科学及编程导论有节课也是用到了这个工具&#xff0c;但这个工具安装不象用起来那么方便&#xff0c;小编就图文全程直播下吧 工具/原料 python2.7.10win10 32位方法/步骤 1缺省状态…

微信扫描二维码和浏览器扫描二维码 ios和Android 分别进入不用的提示页面

实现微信扫描二维码和浏览器扫描二维码 ios和Android 分别进入不用的提示页面 而进入商城下载该项目 详情地址&#xff1a;gitee.com/DuJiaHui123… 1.创建完之后 替换文件里面的ios项目地址和Android地址 2.网页上线 3.百度搜索 二维码生成 把上线后的地址生成二维码 4.可以把…

详解getchar()函数与缓冲区

1、首先&#xff0c;我们看一下这段代码&#xff1a; 它的简单意思就是从键盘读入一个字符&#xff0c;然后输出到屏幕。理所当然&#xff0c;我们输入1&#xff0c;输出就是1&#xff0c;输入2&#xff0c;输出就是2。 那么我们如果输出的是12呢&#xff1f; 它的输出是1。 这…

windows下python安装Numpy、Scipy、matplotlib模块

python 2.7 针对2.7的软件。numpy :http://sourceforge.net/projects/numpy/files/NumPy/1.8.1/ 下载下面的numpy-1.8.2-win32-superpack-python2.7 scipy: http://sourceforge.net/projects/scipy/files/matplotlib:matplotlib-1.1.0.win32-py2.7 以上都是exe文件&#xff0…

restTemplate使用和踩坑总结

日常工作中肯定会遇到服务之间的调用&#xff0c;尤其是现在都是微服务的架构&#xff0c;所以总结一下restTemplate的最常用的用法以及自己踩过的坑。 restTemplate的使用 restTemplate底层调用的是Execute方法&#xff0c;而Execute底层调用的是doExecute&#xff0c;它是基于…