简介

要理解什么是降维,书上给出了一个很好但是有点抽象的例子。
说,看电视的时候屏幕上有成百上千万的像素点,那么其实每个画面都是一个上千万维度的数据;但是我们在观看的时候大脑自动把电视里面的场景放在我们所能理解的三维空间来理解,这个很自然的过程其实就是一个降维(dimensionallity reduction)的过程

降维有什么作用呢?
  1. 数据在低维下更容易处理、更容易使用;
  2. 相关特征,特别是重要特征更能在数据中明确的显示出来;如果只有两维或者三维的话,更便于可视化展示;
  3. 去除数据噪声
  4. 降低算法开销

常见的降维算法有主成分分析(principal component analysis,PCA)、因子分析(Factor Analysis)和独立成分分析(Independent Component Analysis,ICA),其中PCA是目前应用最为广泛的方法。

PCA原理

在PCA中,数据从原来的坐标系转换到新的坐标系,新坐标系的选择是由数据本身决定的。第一个坐标轴的选择是原始数据中方差最大的方向,从数据角度上来讲,这其实就是最重要的方向,即下图总直线B的方向。第二个坐标轴则是第一个的垂直或者说正交(orthogonal)方向,即下图中直线C的方向。该过程一直重复,重复的次数为原始数据中特征的数目。而这些方向所表示出的数据特征就被称为“主成分”。


那怎么来求出这些主成分呢?由线性代数的知识可以知道,通过数据集的协方差矩阵及其特征值分析,我们就可以求得这些主成分的值。一旦得到协方差矩阵的特征向量,就可以保留最大的N个值。然后可以通过把数据集乘上这N个特征向量转换到新的空间。

PCA实现

在python的numpy包中linalg模块的eig()方法可以用于求特征值和特征向量。
从上面的原理分析中我们可以得出讲数据转化成前N个主成分的伪代码如下:
  1. 去除平均值
  2. 计算协方差矩阵
  3. 计算协方差矩阵的特征值和特征向量
  4. 将特征值从大到小排序
  5. 保留最上面的N个特征向量
  6. 将数据转换到上述N个特征向量构建的新空间中
代码实现如下:
  1. # 加载数据的函数
  2. def loadData(filename, delim = '\t'):
  3. fr = open(filename)
  4. stringArr = [line.strip().split(delim) for line in fr.readlines()]
  5. datArr = [map(float,line) for line in stringArr]
  6. return mat(datArr)
  7. # =================================
  8. # 输入:dataMat:数据集
  9. # topNfeat:可选参数,需要应用的N个特征,可以指定,不指定的话就会返回全部特征
  10. # 输出:降维之后的数据和重构之后的数据
  11. # =================================
  12. def pca(dataMat, topNfeat=9999999):
  13. meanVals = mean(dataMat, axis=0)# axis = 0表示计算纵轴
  14. meanRemoved = dataMat - meanVals #remove mean
  15. covMat = cov(meanRemoved, rowvar=0)# 计算协方差矩阵
  16. eigVals,eigVects = linalg.eig(mat(covMat))# 计算特征值(eigenvalue)和特征向量
  17. eigValInd = argsort(eigVals) #sort, sort goes smallest to largest
  18. eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions
  19. redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest
  20. lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
  21. reconMat = (lowDDataMat * redEigVects.T) + meanVals
  22. return lowDDataMat, reconMat
在数据集上进行PCA操作:
  1. filename = r'E:\ml\machinelearninginaction\Ch13\testSet.txt'
  2. dataMat = loadData(filename)
  3. lowD, reconM = pca(dataMat, 1)
原始数据如下:

降维之后:
>>>shape(lowD)
得到(1000,1),可以看到两维降成了一维的数据

通过如下代码把降维后的数据和原始数据打印出来:
  1. def plotData(dataMat,reconMat):
  2. fig = plt.figure()
  3. ax = fig.add_subplot(111)
  4. # 绘制原始数据
  5. ax.scatter(dataMat[:, 0].flatten().A[0], dataMat[:,1].flatten().A[0], marker='^', s = 90)
  6. # 绘制重构后的数据
  7. ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0], marker='o', s = 10, c='red')
  8. plt.show()
如下图所示:
降维之后的方向和我们之前讨论的最大方差方向是吻合的。

如果执行以下代码:
  1. lowD, reconM = pca(dataMat, 2)
和原始数据的维度数一样,相当于没有降维,重构之后的数据会和原始数据重合,如下图所示:


小结

本文中只用了一个比较小的数据集来展示和验证PCA算法。
在实际应用中,数据的维度都是很大的,这些维度的重要性不同,甚至有的维度没有用,这种时候降维就能发挥很大的作用。它可以清除噪声,实现很多比例的数据压缩。
需要强调的是,在使用PCA的时候并不能一下就确定需要的主成分数量,要通过多次的尝试才能确定能够覆盖足够信息量的主成分数量,一般需要保证信息量在90%以上,而且根据不同的应用场景有所不同。
降维一般作为数据适用其他模型算法之前的预处理技术。







降维和PCA的更多相关文章

  1. 机器学习--PCA降维和Lasso算法

    1.PCA降维 降维有什么作用呢?数据在低维下更容易处理.更容易使用:相关特征,特别是重要特征更能在数据中明确的显示出来:如果只有两维或者三维的话,更便于可视化展示:去除数据噪声降低算法开销 常见的降 ...

  2. PCA 降维算法详解 以及代码示例

    转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analys ...

  3. 从矩阵(matrix)角度讨论PCA(Principal Component Analysis 主成分分析)、SVD(Singular Value Decomposition 奇异值分解)相关原理

    0. 引言 本文主要的目的在于讨论PAC降维和SVD特征提取原理,围绕这一主题,在文章的开头从涉及的相关矩阵原理切入,逐步深入讨论,希望能够学习这一领域问题的读者朋友有帮助. 这里推荐Mit的Gilb ...

  4. kaggle 实战 (1): PCA + KNN 手写数字识别

    文章目录 加载package read data PCA 降维探索 选择50维度, 拆分数据为训练集,测试机 KNN PCA降维和K值筛选 分析k & 维度 vs 精度 预测 生成提交文件 本 ...

  5. [OpenCV] Face Detection

    即将进入涉及大量数学知识的阶段,先读下“别人家”的博文放松一下. 读罢该文,基本能了解面部识别领域的整体状况. 后生可畏. 结尾的Google Facenet中的2亿数据集,仿佛隐约听到:“你们都玩儿 ...

  6. paper 50 :人脸识别简史与近期进展

    自动人脸识别的经典流程分为三个步骤:人脸检测.面部特征点定位(又称Face Alignment人脸对齐).特征提取与分类器设计.一般而言,狭义的人脸识别指的是"特征提取+分类器"两 ...

  7. 【学习笔记】非监督学习-k-means

    目录 k-means k-means API k-means对Instacart Market用户聚类 Kmeans性能评估指标 Kmeans性能评估指标API Kmeans总结 无监督学习,顾名思义 ...

  8. GoogLeNet 改进之 Inception-v2/v3 解读

    博主在前一篇博客中介绍了GoogLeNet 之 Inception-v1 解读中的结构和思想.Inception的计算成本也远低于VGGNet.然而,Inception架构的复杂性使得更难以对网络进行 ...

  9. [CNN] Face Detection

    即将进入涉及大量数学知识的阶段,先读下“别人家”的博文放松一下. 读罢该文,基本能了解面部识别领域的整体状况. 后生可畏. 结尾的Google Facenet中的2亿数据集,仿佛隐约听到:“你们都玩儿 ...

随机推荐

  1. 夯实Java基础(二)——面向对象之封装

    1.封装介绍 封装封装,见名知意,就是把东西包装隐藏起来,不被外界所看见, 而Java特性封装:是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数 ...

  2. RocketMQ中Broker的HA策略源码分析

    Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...

  3. Unity经典游戏编程之:球球大作战

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  4. Struts1.x 跨站脚本(XSS)漏洞的解决

    一. 演示XSS   当访问一个不存在的网址时,例如[url]http://localhost:8080/demo/noAction.do[/url],那么Struts处理后都会跳到提示“Invali ...

  5. Python项目中的单元测试

    引入 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元 ...

  6. (17)ASP.NET Core EF基于数据模型创建数据库

    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上 ...

  7. HTTP2.0的多路复用和HTTP1.X中的长连接复用区别

    HTTP/2 多路复用 (Multiplexing)    多路复用允许同时通过单一的 HTTP/2 连接发起多重的请求-响应消息 HTTP1.1 在HTTP/1.1协议中,浏览器客户端在同一时间,针 ...

  8. sparksession创建DataFrame方式

    spark创建dataFrame方式有很多种,官方API也比较多 公司业务上的个别场景使用了下面两种方式 1.通过List创建dataFrame /** * Applies a schema to a ...

  9. docker An error occurred 虚拟化错误解决

    问题: 本人电脑上装了VMware和docker,系统是win10专业版,然后今天想用下docker,打开报错,Hyper-V未开启,开启之后再次报错 An error occurred Hardwa ...

  10. EF-运行原理

    一.什么是EF? 实体架构(Entity Framework)是微软以来ADO.Net为基础开发出来的对象关系映射(ORM)解决方案,它解决了对象持久化问题,将程序员从编写麻烦的SQL语句中解放出来. ...