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

  1. 机器学习基础与实践(三)----数据降维之PCA

    写在前面:本来这篇应该是上周四更新,但是上周四写了一篇深度学习的反向传播法的过程,就推迟更新了.本来想参考PRML来写,但是发现里面涉及到比较多的数学知识,写出来可能不好理解,我决定还是用最通俗的方法 ...

  2. 降维技术---PCA

    数据计算和结果展示一直是数据挖掘领域的难点,一般情况下,数据都拥有超过三维,维数越多,处理上就越吃力.所以,采用降维技术对数据进行简化一直是数据挖掘工作者感兴趣的方向. 对数据进行简化的好处:使得数据 ...

  3. 降维之pca算法

    pca算法: 算法原理: pca利用的两个维度之间的关系和协方差成正比,协方差为0时,表示这两个维度无关,如果协方差越大这表明两个维度之间相关性越大,因而降维的时候, 都是找协方差最大的. 将XX中的 ...

  4. 降维【PCA & SVD】

    PCA(principle component analysis)主成分分析 理论依据 最大方差理论 最小平方误差理论 一.最大方差理论(白面机器学习) 对一个矩阵进行降维,我们希望降维之后的每一维数 ...

  5. 机器学习算法总结(九)——降维(SVD, PCA)

    降维是机器学习中很重要的一种思想.在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”.另 ...

  6. 降维方法PCA与SVD的联系与区别

    在遇到维度灾难的时候,作为数据处理者们最先想到的降维方法一定是SVD(奇异值分解)和PCA(主成分分析). 两者的原理在各种算法和机器学习的书籍中都有介绍,两者之间也有着某种千丝万缕的联系.本文在简单 ...

  7. ML: 降维算法-PCA

            PCA (Principal Component Analysis) 主成份分析 也称为卡尔胡宁-勒夫变换(Karhunen-Loeve Transform),是一种用于探索高维数据结 ...

  8. 特征降维之PCA

    目录 PCA思想 问题形式化表述 PCA之协方差矩阵 协方差定义 矩阵-特征值 PCA运算步骤 PCA理论解释 最大方差理论 性质 参数k的选取 数据重建 主观理解 应用 代码示例 PCA思想 PCA ...

  9. 机器学习之路:python 特征降维 主成分分析 PCA

    主成分分析: 降低特征维度的方法. 不会抛弃某一列特征, 而是利用线性代数的计算,将某一维度特征投影到其他维度上去, 尽量小的损失被投影的维度特征 api使用: estimator = PCA(n_c ...

  10. 降维算法-PCA主成分分析

    1.PCA算法介绍主成分分析(Principal Components Analysis),简称PCA,是一种数据降维技术,用于数据预处理.一般我们获取的原始数据维度都很高,比如1000个特征,在这1 ...

随机推荐

  1. Maven+ajax+SSM实现删除

    转载自:https://www.cnblogs.com/kebibuluan/p/9020381.html 3.尚硅谷_SSM高级整合_使用ajax操作实现删除的功能 点击删除的时候,要删除联系人,这 ...

  2. 微信小程序使用Websocket

    /** 初始化websocket stomp文档 http://jmesnil.net/stomp-websocket/doc/*/initSocket: function () {var that ...

  3. 关于CKCsec安全研究院

    关于CKCsec安全研究院 CKCsec安全研究院所有文档开源于语雀,会源源不断更新. 部分内容 微信公众号 知识星球 使用需知 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均 ...

  4. 【Java常用类】BigDecimal

    BigDecimal 一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类. BigDecimal类支 ...

  5. 探索新冠肺炎(COVID-19)对全球航班的影响

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 随着今天从欧洲到美国的旅行限制生效,以及为了减缓新冠病毒的传播更 ...

  6. Windows和Linux(Centos7)下安装Nginx

    安装Nginx 这篇记录只不过做了一个简单总结,如果对这块没什么概念的话可以看一下知乎的这篇文章 https://zhuanlan.zhihu.com/p/83890573 window下安装 win ...

  7. python技巧一行命令搞定局域网共享

    python超强玩法--一行命令搞定局域网共享 ​ 今天刷到python的一个新玩法,利用python自带的http服务,快速创建局域网共享服务,命令如下: python -m thhp.server ...

  8. golang中的标准库strconv

    strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...

  9. StringBuilder类介绍

    1 package cn.itcast.p2.stringbuffer.demo; 2 3 public class StringBuilderDemo { 4 public static void ...

  10. python 中 *args he **kwargs的区别

    ''' 一 *args 和 **kwargs 的区别? *args 表示任意个 无名参数, 类型是元祖 tuple. **kwargs 表示的是关键字的参数 传入的参数是 dict 类型. 当*和** ...