简介

要理解什么是降维,书上给出了一个很好但是有点抽象的例子。
说,看电视的时候屏幕上有成百上千万的像素点,那么其实每个画面都是一个上千万维度的数据;但是我们在观看的时候大脑自动把电视里面的场景放在我们所能理解的三维空间来理解,这个很自然的过程其实就是一个降维(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. Spring浅入浅出——不吹牛逼不装逼

    Spring浅入浅出——不吹牛逼不装逼 前言: 今天决定要开始总结框架了,虽然以前总结过两篇,但是思维是变化的,而且也没有什么规定说总结过的东西就不能再总结了,是吧.这次总结我命名为浅入浅出,主要在于 ...

  2. c++随笔之编译器编译原理

    /* C++编译器原理:1)首先明白声明与定义是两个不同的概念 extern int i;是声明,int i;是定义 函数就更简单了2)编译分为: 预编译:将宏替换,include等代码拷贝过来 编译 ...

  3. HTML之必备meta标签

    meta标签写在HTML的<head>中,推荐每个手机H5页面必加以下的代码: <head> <meta charset="UTF-8"> &l ...

  4. java之异常详解

    一.什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域正常运行的情况,称之为异常. 二.异常体系 Java把异常当作对象来处理,并定义一个基类java. ...

  5. Scrapy爬虫框架学习

    一.Scrapy框架简介 1. 下载页面 2. 解析 3. 并发 4. 深度 二.安装 linux下安装 pip3 install scrapy windows下安装 a.pip3 install w ...

  6. SQL Server 数据完整性的实现——约束

    SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性.作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declara ...

  7. Redis 学习笔记(篇九):主从复制

    Redis 中,可以通过执行 savleof 命令或者设置 slaveof 选项,让一个服务器去复制另一个服务器,我们称被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器. Red ...

  8. linux下python中文乱码解决方案

    1. 场景描述 linux服务器下安装了Anaconda3,执行Pyhton的K-means算法,结果出现如下图的中文字符乱码.上次已经解决了,忘记记录解决流程了,这次配置了一台新的服务器,又出现,默 ...

  9. python之“装饰器”

    在python里装饰器 其定义:装饰器就是一个函数,用来装饰其他函数,就是给其他函数添加功能. 装饰器有两个特点: 1.装饰器不修改被装饰函数的源码: 2.装饰器不锈钢被装饰函数的调用方式. 在编程中 ...

  10. git 导出新修改的文件

    git archive -o update.zip HEAD $(git diff --name-only HEAD)