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

    在读源码框架时遇到方法中有这样的形参:{ message = 'ok' } = {} 有点懵为什么已经赋值了还又赋了一个空对象 随后我去看了阮一峰老师的 ECMAScript 6 入门才明白.这是参数 ...

  2. Python_魔法属性和方法

    魔法属性 __doc__:表示类或方法的描述信息 __moudle__:表示当前操作对象的模块,当前模块时,显示__main__ __class__:表示当前操作对象的类型 __name__:表示类或 ...

  3. Nginx_安装配置

    一.安装gcc依赖库 检查是否安装(linux默认是安装了的) gcc –version  

  4. AI系统——梯度累积算法

    明天博士论文要答辩了,只有一张12G二手卡,今晚通宵要搞定10个模型实验 挖槽,突然想出一个T9开天霹雳模型,加载不进去我那张12G的二手卡,感觉要错过今年上台Best Paper领奖   上面出现的 ...

  5. Echart可视化学习(七)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 正文: 官网找到类似实例, 适当分 ...

  6. 【Java常用类】BigInteger

    BigInteger Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的, 最大为2 ^63-1.如果要表示再大的整数,不管是基本数据类型还是他们的包装类 都无 ...

  7. 解决vscode下载很慢的问题

    1.打开vscode官网,https://code.visualstudio.com; 2.点击下载稳定版;这里我的电脑是win10版本 3.下载时可以去谷歌的下载内容里面,看到正在下载的vscode ...

  8. 利用SelectPdf插件将网页生成PDF

    简介 适用于.NET Framework和.NET Core的HTML至PDF转换器 SelectPdf提供的在线html到pdf转换器使用.NET的Select.Pdf库中的html到pdf转换器. ...

  9. tarjan全家桶

    tarjan 全家桶 关于tarjan 它太强了 CCCOrz dfs树&low dfs树:在图上做不重复经过同一点的dfs,经过的边与点形成一棵树.于是图上所有点都被这棵树包含,一部分边被包 ...

  10. 『无为则无心』Python基础 — 42、Python中文件的读写操作(二)

    目录 (5)文件对象方法(重点) 1)写方法 2)读方法 3)seek()方法 4)tell()方法 (6)关闭 (7)综合练习:读取大文件 (5)文件对象方法(重点) 1)写方法 @1.语法 对象对 ...