PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

在Scikit中运用PCA很简单:

import numpy as np
from sklearn import decomposition
from sklearn import datasets iris = datasets.load_iris()
X = iris.data
y = iris.target pca = decomposition.PCA(n_components=3)
pca.fit(X)
X = pca.transform(X)

以上代码是将含有4个特征的数据经过PCA压缩为3个特征。PCA的压缩由如下特点:

  • 新的3个特征并不是随便删除一个特征后留下的,而是4个特征的线性组合。
  • 新的3个特征保留了原有4个特征的绝大部分信息,换句话说就是略有损失。

那么PCA的损失到底是什么? 新特征能否转回旧特征?

这要从PCA过程说起,我把过程缩减如下,毕竟本文重点不是说PCA过程:

PCA过程

1.均值化矩阵X

2.通过一系列矩阵运算得出  特征矩阵P

3.矩阵运算 Y = P * X

Y 即为原始数据降维后的结果,也就是说,得到矩阵P后,我们还可以通过Y=P * X这个算式, 反推回X:

Y = P * X ==>   P(-1) * Y = P(-1) * P * X,  P(-1)是P的逆矩阵, 即 P(-1) * P = 1

==>   P(-1) * Y = X

需要注意的是,程序一开始就已经将原始数据均值化,所以实际上, P(-1)*Y的结果需要去均值化才是原来的样子

在Scikit中,pca.components_就是P的逆矩阵.  从源代码就可以看出(行号33)

    def transform(self, X, y=None):
"""Apply dimensionality reduction to X. X is projected on the first principal components previously extracted
from a training set. Parameters
----------
X : array-like, shape (n_samples, n_features)
New data, where n_samples is the number of samples
and n_features is the number of features. Returns
-------
X_new : array-like, shape (n_samples, n_components) Examples
-------- >>> import numpy as np
>>> from sklearn.decomposition import IncrementalPCA
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> ipca = IncrementalPCA(n_components=2, batch_size=3)
>>> ipca.fit(X)
IncrementalPCA(batch_size=3, copy=True, n_components=2, whiten=False)
>>> ipca.transform(X) # doctest: +SKIP
"""
check_is_fitted(self, ['mean_', 'components_'], all_or_any=all)
print self.mean_
X = check_array(X)
if self.mean_ is not None:
X = X - self.mean_
X_transformed = fast_dot(X, self.components_.T)
if self.whiten:
X_transformed /= np.sqrt(self.explained_variance_)
return X_transformed

回到开头的压缩代码增加一些输出语句:

iris = datasets.load_iris()
X = iris.data
y = iris.target print X[0]
pca = decomposition.PCA(n_components=3)
pca.fit(X)
X = pca.transform(X) a = np.matrix(X)
b = np.matrix(pca.components_)
c = a * b
mean_of_data = np.matrix([5.84333333, 3.054, 3.75866667, 1.19866667]) print c[0]
print c[0] + mean_of_data

程序打印出原始数据中的第一行,然后将降维后的数据乘上特征矩阵的逆矩阵,加上均值还原回原来的4特征。

输出如下:

 [ 5.1  3.5  1.4  0.2]

 [[-0.74365254  0.44632609 -2.35818399 -0.99942241]]

 [[ 5.09968079  3.50032609  1.40048268  0.19924426]]

由此可看, 经还原后的特征值(行号5)和原来(行号1)相比,每一个特征都略有变化。

如果维度不降,我们可以再看看结果

pca = decomposition.PCA(n_components=4)
pca.fit(X)
X = pca.transform(X) a = np.matrix(X)
b = np.matrix(pca.components_)
c = a * b
mean_of_data = np.matrix([5.84333333, 3.054, 3.75866667, 1.19866667]) print c[0]
print c[0] + mean_of_data

完美还原:

 [ 5.1  3.5  1.4  0.2]

 [[-0.74333333  0.446      -2.35866667 -0.99866667]]

 [[ 5.1  3.5  1.4  0.2]]

在SCIKIT中做PCA 逆运算 -- 新旧特征转换的更多相关文章

  1. 在SCIKIT中做PCA 逆变换 -- 新旧特征转换

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

  2. 新旧图号(图幅号)转换/计算/检查,经纬度转换计算,C#代码

    图号(图幅号):地图图号是指为便于使用和管理,按照一定方法将各分幅地图进行的编号. 经常用到图号,但是在网上一直没有找到一个完整的图号转换程序,因此自己写了一个图号处理的库,分享出来.如有错误请指正. ...

  3. Linux中“新旧”TCP/IP工具的对比

    如今很多系统管理员依然通过组合使用诸如ifconfig.route.arp和netstat等命令行工具(统称为net-tools)来配置网络功能.解决网络故障,net-tools起源于BSD的TCP/ ...

  4. 转:如何在 LoadRunner 脚本中做关联 (Correlation)

    如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...

  5. 使用Flexbox:新旧语法混用实现最佳浏览器兼容

    Flexbox非常的棒,肯定是未来布局的一种主流.在过去的几年这之中,语法改变了不少,这里有一篇“旧”和“新”新的语法区别教程(如果你对英文不太感兴趣,可以移步阅读中文版本).但是,如果我们把Flex ...

  6. MapReduce简述、工作流程及新旧API对照

    什么是MapReduce? 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查而且数出有多少张是黑桃. MapReduce方法则是: 1. 给在座的全部玩家中分配这摞牌. 2. 让每一个玩家数自己手 ...

  7. 【笔记】scikit-learn中的PCA(真实数据集)

    sklearn中的PCA(真实的数据集) (在notebook中) 加载好需要的内容,手写数字数据集 import numpy as np import matplotlib.pyplot as pl ...

  8. vbox中虚拟ubuntu增加新的虚拟硬盘

    vbox中虚拟ubuntu增加新的虚拟硬盘   在virtualbox中装好Ubuntu后,发现硬盘空间不够使用 了.以下是搜集整理的解决办法:   1. 添加新硬盘        设置 -> ...

  9. Matlab神经网络函数newff()新旧用法差异

    摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...

随机推荐

  1. git使用教程及github远程仓库管理

    git使用教程步骤 1.安装git 安装完后,在开始菜单里找到"git"->"Git Bash",蹦出一个类似命令行窗口,说明安装成功.2 注册git 在 ...

  2. CentOS7 更换yum源

    yum源调整为163wget http://mirrors.163.com/.help/CentOS7-Base-163.repo[root@admin yum.repos.d]# mv CentOS ...

  3. 一个简单用原生js实现的小游戏----FlappyBird

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习 这是html结构 <!DOCTYPE html><html lang="en">&l ...

  4. scss语法介绍

    这里既然是对语法的介绍,那么至于如何安装和编译scss我就不多少了,主要是因为本人在群里认识的小伙伴有的不会用scss,所以就借着放假的机会来对scss语法做个总结,博主在开发过程中用scss蛮多,所 ...

  5. 老李分享:Mac快捷键

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  6. JDBC基础学习(三)—处理BLOB类型数据

    一.BLOB类型介绍      在MySQL中,BLOB是一个二进制的大型对象,可以存储大量数据的容器,它能容纳不同大小的数据.      在MySQL中有四种BLOB类型.          实际使 ...

  7. 线上分享会.net框架“ABP”分享会总结

    前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...

  8. 计算机程序的思维逻辑 (79) - 方便的CompletionService

    上节,我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供了一个方便的方法,使用Comple ...

  9. phpcms课堂笔记

    获取父分类下面的子分类 {loop subcat(77) $k $v}{php $subcatid[] = $k;}{/loop}<?php $subcatid = implode(',', $ ...

  10. 使用live555 在linux下搭建 rtsp server

    系统环境 Debian 7 x64  / centos 7 x64  都可以 首先去下载源码 http://www.live555.com/liveMedia/public/live555-lates ...