降维和PCA

简介



要理解什么是降维,书上给出了一个很好但是有点抽象的例子。

说,看电视的时候屏幕上有成百上千万的像素点,那么其实每个画面都是一个上千万维度的数据;但是我们在观看的时候大脑自动把电视里面的场景放在我们所能理解的三维空间来理解,这个很自然的过程其实就是一个降维(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%以上,而且根据不同的应用场景有所不同。

降维一般作为数据适用其他模型算法之前的预处理技术。

来自为知笔记(Wiz)

时间: 2024-10-24 15:08:12

降维和PCA的相关文章

统计学习精要

统计学习精要(The Elements of Statistical Learning)课堂笔记系列 Posted at January 2nd, 2014 Filed under 课程教材:The Elements of Statistical Learning http://www-stat.stanford.edu/~tibs/ElemStatLearn/ 授课人:复旦大学计算机学院 吴立德教授 分节课堂笔记: 统计学习精要(The Elements of Statistical Lear

矩阵特征值分解与奇异值分解含义解析及应用

此文有一半转载自他出,主要在这进行个整理,具体内容文中都有相关的转载链接. 特征值与特征向量的几何意义 矩阵的乘法是什么,别只告诉我只是"前一个矩阵的行乘以后一个矩阵的列",还会一点的可能还会说"前一个矩阵的列数等于后一个矩阵的行数才能相乘",然而,这里却会和你说--那都是表象. 矩阵乘法真正的含义是变换,我们学<线性代数>一开始就学行变换列变换,那才是线代的核心--别会了点猫腻就忘了本--对,矩阵乘法 就是线性变换,若以其中一个向量A为中心,则B的作用

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

转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analysis ( 主成分分析) 最近发现我的一篇关于PCA算法总结以及个人理解的博客的访问量比较高, 刚好目前又重新学习了一下PCA (主成分分析) 降维算法, 所以打算把目前掌握的做个全面的整理总结, 能够对有需要的人有帮助. 自己再看自己写的那个关于PCA的博客, 发现还是比较混乱的, 希望这里能过做好

支付宝刷脸——我们进入了一个怎样的刷脸时代

随着2016年6月份左右支付宝的一次更新,其中的刷脸功能终于从幕后走到前台,这次我就借支付宝上的刷脸系统,来聊聊人脸识别的那些事儿.事先声明,这是一篇科普小文章,言语轻松. 一.简单界面蕴含不简单道理 下面是支付宝刷脸过程中的一个界面(截图来自网络): 这个刷脸界面主要元素有三个:脸部框."眨眨眼".一张脸.接下来我们逐一介绍. 1.脸部框--人脸监测与人脸识别不可兼得 支付宝刷脸的一个基本要求就是需要用户赏个脸,并且要把脸赏在界面的指定框线内,这样做实际上是节省了一个非常大的算法开销

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

自动人脸识别的经典流程分为三个步骤:人脸检测.面部特征点定位(又称Face Alignment人脸对齐).特征提取与分类器设计.一般而言,狭义的人脸识别指的是"特征提取+分类器"两部分的算法研究. 在深度学习出现以前,人脸识别方法一般分为高维人工特征提取(例如:LBP, Gabor等)和降维两个步骤,代表性的降维方法有PCA, LDA等子空间学习方法和LPP等流行学习方法.在深度学习方法流行之后,代表性方法为从原始的图像空间直接学习判别性的人脸表示. 一般而言,人脸识别的研究历史可以分

PCA降纬一步一步

import numpy as np 第一步:原始值 X1 0.9 2.4 1.2 0.5 0.3 1.8 0.5 0.3 2.5 1.3 X2 1 2.6 1.7 0.7 0.7 1.4 0.6 0.6 2.6 1.1 第二步:计算平均值 =1.17,np.mean(x1)=1.1700000000000002 =1.3,  np.mean(x2)=1.3 第三步:X1 - ,X2 - ,得到如下表格 X11 0.9-=-0.27 2.4-=1.23 1.2-=0.03 0.5-=-0.67

A tutorial on Principal Components Analysis | 主成分分析(PCA)教程

A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components Analysis, February 26, 2002. 翻译:houchaoqun.时间:2017/01/18.出处:http://blog.csdn.net/houchaoqun_xmu  |  http://blog.csdn.net/Houchaoqun_XMU/article/details

[python机器学习及实践(6)]Sklearn实现主成分分析(PCA)

1.PCA原理 主成分分析(Principal Component Analysis,PCA), 是一种统计方法.通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分. PCA算法: 2.PCA的实现 数据集: 64维的手写数字图像 代码: #coding=utf-8 import numpy as np import pandas as pd from sklearn.decomposition import PCA from matplotlib imp

[降维] PCA 主成分分析

其实早该整理一下PCA了,怎奈一直没有时间,可能是自己对时间没有把握好吧,下面进入正题. 降维的概念 所谓降维,就是降低数据的维数.在机器学习中尤其常见,之前做过对一幅图片提取小波特征,对于一幅大小为800*600的图片,如果每个点提取五个尺度.八个方向的特征,那么每一个像素点提取40个特征,那么一副图片的话就是40*800*600=19200000个特征.也就是我们用一个19200000的向量描述一幅图片.如果有m幅图片,那么特征为m*19200000的大小.显然这个维数太大了,所以需要降维.