PCA是一种非监督学习算法,它能够在保留大多数有用信息的情况下,有效降低数据纬度。

它主要应用在以下三个方面:

1. 提升算法速度

2. 压缩数据,减小内存、硬盘空间的消耗

3. 图示化数据,将高纬数据映射到2维或3维

总而言之,PCA干的事情就是完成一个将原始的n维数据转化到k维的映射。其中,k<n

它的核心算法如下:

1. 将数据均一化

x' = [x-mean(x)] / range(x)

2. 计算它的协方差矩阵

即:Sigma = 1/m * x' * x

3. 进行svd分解,计算特征向量

[U, S, V] = svd(Sigma)

选出U中的前k列,就可以得到映射公式啦

即:

Ureduce = U(:, 1:k);

z = Ureduce'*x;

其中,z便是降维后映射得到的特征矩阵。

至于如何选择k,那要看我们决定保留原始信息的多少变化范围(variance)。当我们想保留

原始信息99%的variance时:

即:将S中前k个对角线元素相加,最小的能使相加和大于整个S的对角线和的99%的k便是我们应选择的k。

有压缩,那自然就有相应的还原。不过PCA本身的压缩是有损压缩,无法还原为与原来完全一样的值。(当然k=n另当别论)

我们只能够得到原始特征向量(非矩阵)的近似还原值。公式为:

即:Xapprox = Ureduce * Z

在使用PCA时,有几个要注意的地方:

1. 构建机器学习算法时,不要一上来就想要用PCA,一般而言,直接使用原始特征效果会比较好。

PCA是在原始算法过于缓慢,或者内存、硬盘空间实在不够大无法支撑计算时才有必要加入的

2. 不要用PCA来减小过拟合的问题,用regularization才是解决过拟合更为合理的方法。因为

PCA只看特征矩阵来决定如何减小特征数,而regularization同时看特征矩阵和对应的label来减小过拟合。

非监督的降维算法--PCA的更多相关文章

  1. [机器学习理论] 降维算法PCA、SVD(部分内容,有待更新)

    几个概念 正交矩阵 在矩阵论中,正交矩阵(orthogonal matrix)是一个方块矩阵,其元素为实数,而且行向量与列向量皆为正交的单位向量,使得该矩阵的转置矩阵为其逆矩阵:  其中,为单位矩阵. ...

  2. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  3. 机器学习实战基础(二十):sklearn中的降维算法PCA和SVD(一) 之 概述

    概述 1 从什么叫“维度”说开来 我们不断提到一些语言,比如说:随机森林是通过随机抽取特征来建树,以避免高维计算:再比如说,sklearn中导入特征矩阵,必须是至少二维:上周我们讲解特征工程,还特地提 ...

  4. ML: 降维算法-PCA

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

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

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

  6. 机器学习实战基础(二十三):sklearn中的降维算法PCA和SVD(四) PCA与SVD 之 PCA中的SVD

    PCA中的SVD 1 PCA中的SVD哪里来? 细心的小伙伴可能注意到了,svd_solver是奇异值分解器的意思,为什么PCA算法下面会有有关奇异值分解的参数?不是两种算法么?我们之前曾经提到过,P ...

  7. 降维算法----PCA原理推导

    1.从几何的角度去理解PCA降维 以平面坐标系为例,点的坐标是怎么来的? 图1                                                             ...

  8. 机器学习实战基础(二十七):sklearn中的降维算法PCA和SVD(八)PCA对手写数字数据集的降维

    PCA对手写数字数据集的降维 1. 导入需要的模块和库 from sklearn.decomposition import PCA from sklearn.ensemble import Rando ...

  9. 机器学习实战基础(二十四):sklearn中的降维算法PCA和SVD(五) PCA与SVD 之 重要接口inverse_transform

    重要接口inverse_transform  在上周的特征工程课中,我们学到了神奇的接口inverse_transform,可以将我们归一化,标准化,甚至做过哑变量的特征矩阵还原回原始数据中的特征矩阵 ...

随机推荐

  1. apache启动错误 AH00072: make_sock: could not bind to address [::]:443 windows系统端口/进程查看

    1. netstat -ano|findstr " 2. tasklist|findstr "

  2. 蓝牙App漏洞系列分析之一CVE-2017-0601

    蓝牙App漏洞系列分析之一CVE-2017-0601 0x01 概要 2017年5月的 Android 安全公告修复了我们提交的一个蓝牙提权中危漏洞,这个漏洞尽管简单,但比较有意思,能够使本地恶意 A ...

  3. C获取数组长度

    c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数) 如: { int data[4]; int length; length=sizeof(data)/sizeof(data[ ...

  4. 小程序UI设计(8)-布局分解-FlexBox的align-content应用

    FlexBox的align-content到底是什么鬼,我也搞了好半天才开发出来,目前工具中WViewRow组件使用了此属性,WViewColumn中此属性不起作用.下图是justify-conten ...

  5. java 多线程,线程安全等定义

    线程安全, synchronized的使用,保证方法或代码块操作的原子性.可见性和有序性 参考这篇文章: 7张图带你轻松理解Java 线程安全 public class ThreadDemo { pr ...

  6. java8学习之Predicate深入剖析与函数式编程本质

    上次[http://www.cnblogs.com/webor2006/p/8214596.html]对Predicate函数接口进行了初步的学习,其中提到了在未来要学习的Stream中得到了大量的应 ...

  7. qt qttablewidget

    item setitem 界面显示文件卡住 建议:不要用setitem 应该用insertitem

  8. 二维数组转化为json数组

    二维数组转化为json数组 -1 var colName = [ ["08020092", "AVX", "1200m", "12 ...

  9. git回退错误的提交

    提交代码导致冲突,执行merge后,冲掉其他人的提交.需要reset,并新建分支进行恢复 解决方法: 1.找到最后一次提交到master分支的版本号,即[merge前的版本号] 2.会退到某个版本号 ...

  10. 基于locust的性能测试平台搭建

    前段时间加入性能测试组,并参与搭建基于locust的性能测试平台,我分到的任务相对独立,开发locust的启动接口和停止运行接口,现开发的差不多了,做一个总结 一.locust运行的相关内容 二.lo ...