在SCIKIT中做PCA 逆变换 -- 新旧特征转换
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 逆变换 -- 新旧特征转换的更多相关文章
- 在SCIKIT中做PCA 逆运算 -- 新旧特征转换
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- 新旧图号(图幅号)转换/计算/检查,经纬度转换计算,C#代码
图号(图幅号):地图图号是指为便于使用和管理,按照一定方法将各分幅地图进行的编号. 经常用到图号,但是在网上一直没有找到一个完整的图号转换程序,因此自己写了一个图号处理的库,分享出来.如有错误请指正. ...
- Linux中“新旧”TCP/IP工具的对比
如今很多系统管理员依然通过组合使用诸如ifconfig.route.arp和netstat等命令行工具(统称为net-tools)来配置网络功能.解决网络故障,net-tools起源于BSD的TCP/ ...
- 转:如何在 LoadRunner 脚本中做关联 (Correlation)
如何在 LoadRunner 脚本中做关联 (Correlation) 当录制脚本时,VuGen会拦截client端(浏览器)与server端(网站服务器)之间的对话,并且通通记录下来,产生脚本.在V ...
- 使用Flexbox:新旧语法混用实现最佳浏览器兼容
Flexbox非常的棒,肯定是未来布局的一种主流.在过去的几年这之中,语法改变了不少,这里有一篇“旧”和“新”新的语法区别教程(如果你对英文不太感兴趣,可以移步阅读中文版本).但是,如果我们把Flex ...
- MapReduce简述、工作流程及新旧API对照
什么是MapReduce? 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查而且数出有多少张是黑桃. MapReduce方法则是: 1. 给在座的全部玩家中分配这摞牌. 2. 让每一个玩家数自己手 ...
- 【笔记】scikit-learn中的PCA(真实数据集)
sklearn中的PCA(真实的数据集) (在notebook中) 加载好需要的内容,手写数字数据集 import numpy as np import matplotlib.pyplot as pl ...
- vbox中虚拟ubuntu增加新的虚拟硬盘
vbox中虚拟ubuntu增加新的虚拟硬盘 在virtualbox中装好Ubuntu后,发现硬盘空间不够使用 了.以下是搜集整理的解决办法: 1. 添加新硬盘 设置 -> ...
- Matlab神经网络函数newff()新旧用法差异
摘要 在Matlab R2010a版中,如果要创建一个具有两个隐含层.且神经元数分别为5.3的前向BP网络,使用旧的语法可以这样写: net1 = newff(minmax(P), [5 3 1]); ...
随机推荐
- jdbc查询
import java.util.ArrayList; import java.util.List; import org.springframework.jdbc.core.BeanProperty ...
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集
http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...
- Canada Cup 2016 D. Contest Balloons 好题。优先队列 + 简单贪心
http://codeforces.com/contest/725/problem/D 这题一看就是贪心的了,w - t最小的那个,肯定是优先打死. 但是一直都不会写,为什么呢,因为这个太像二分答案了 ...
- (转)Nginx/Apache服务连接数梳理
Nginx/Apache服务连接数梳理 原文:http://www.cnblogs.com/kevingrace/p/6211542.html 统计连接数,使用netstat命令或ss命令都可以1)统 ...
- RDL Web报表抛出ReportServerException,已取消该操作
::, RsBase() [ERROR] - Microsoft.Reporting.WebForms.ReportServerException: 已取消该操作. ---> System.Op ...
- C. Journey
C. Journey time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- watir 的api在线文档
http://rubydoc.info/gems/watir-webdriver/frames http://rdoc.info/gems/watir-webdriver/frames http:// ...
- Eclipse Debug模式和断点调试
1行号上双击,打断点:再双击,取消断点.一般想调试哪一句代码,就在哪一句和下一句打上断点. 2在要执行的class文件上(有main方法的),右键--Debug As 然后程序正常走,当走到断点时,会 ...
- Generator 和 函数异步应用 笔记
Generator > ES6 提供的一种异步编程解决方案 > Generator 函数是一个状态机,封装了多个内部状态.还是一个遍历器对象生成函数.返回<label>遍历器对 ...
- leetcdoe Valid Anagram
题目连接 https://leetcode.com/problems/valid-anagram/ Valid Anagram Description Given two strings s and ...