sklearn中的降维算法PCA和SVD

1 概述

1.1 什么叫“维度”

对于数组和Series来说,维度就是功能shape返回的结果,shape中返回了几个数字,就是几维。索引以外的数据,不分行列的叫一维(此时shape返回唯一的维度上的数据个数),有行列之分叫二维(shape返回行*列),也称为表。一张表最多二维,复数的表构成了更高的维度。但一个数组中存在2张3行4列的表时,shape返回的是(2,3,4)。
数组中的每一张表,都可以是一个特征矩阵(矩阵可以是任意正数维,但特征矩阵特指二维)或一个DataFrame,这些结构永远只有一张表,所以一定有行列,其中行是样本,列是特征。针对每一张表,维度指的是样本的数量或特征的数量,一般无特别说明,指的都是特征的数量。除了索引之外,n个特征就是n维特征矩阵。
对图像来说,维度就是图像中特征向量的数量。特征向量可以理解为坐标轴,一个特征向量定义一条直线,是一维,两个相互垂直的特征向量定义一个平面,即一个直角坐标系,就是二维,三个相互垂直的特征向量定义一个空间,即一个立体直角坐标系,就是三维。三个以上的特征向量相互垂直,定义是人眼无法看见的,也无法想象的高维空间。
降维算法中的“降维”,指的是降低特征矩阵中特征的数量。降维的目的是为了让算法运算更快,效果更好。但还有另一种需求:数据可视化

1.2 sklearn中的降维算法

sklearn中降维算法都被包括在模块decomposition中,这个模块本质是一个矩阵分解模块。

  • 主成分分析
    decomposition.PCA——主成分分析(PCA)
    decomposition.IncrementalPCA——增量主成分分析(IPCA)
    decomposition.KernelPCA——核主成分分析(KPCA)
    decomposition.MiniBathchSparsePCA——小批量稀疏主成分分析
    decomposition.SparsePCA——稀疏主成分分析(SparsePCA)
    decomposition.TruncatedSVD——截断的SVD(aka LSA)
  • 因子分析
    decomposition.FactorAnalysis——因子分析(FA)
  • 独立成分分布
    decomposition.FastICA——独立成分分析的快速算法
  • 字典学习
    decomposition.DictionaryLearning——字典学习
    decomposition.MiniBatchDictionaryLearning——小批量字典学习
    decomposition.dict_learning——字典学习用于矩阵分解
    decomposition.dict_learning_online——在线字典学习用于矩阵分解
  • 高级矩阵分解
    decomposition.LatterDirichletAllocation——具有在线变分贝叶斯算法的隐含狄利克雷分布(LDA)
    decomposition.NMF——非负矩阵分解(NMF)
  • 其他矩阵分解
    decomposition.SparseCoder——稀疏编码
    SVD和主成分分析PCA都属于矩阵分解算法中的入门算法,都是通过分解特征矩阵来进行降维。

2 PCA和SVD

在降维过程中,会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受到影响。同时,在高维数据中,必然有一些特征是不带有有效的信息的(如噪音),或者有些特征带有的信息和其他一些特征是重复的(如多重共线性)。希望能够找到一种办法来衡量特征上所带的信息量,使得在降维过程中,能够既减少特征的数量,又保留大部分有效信息。将那些带有重复信息的特征合并,并删除哪些带无效信息的特征等等,创造出能够代表原特征矩阵大部分信息的、特征更少的新特征矩阵。
特征工程中有一种重要的特征选择方法:方差过滤。如果一个特征的方差很小,则意味着这个特征很可能有大量取值都想要,那这个特征的取值对样本而言就没有区分度,这种特征就不带有有效信息。从方差的这一应用可以推断出,如果一个特征的方差很大,则说明这个特征上带有大量的信息。因此,在降维中,PCA使用的信息量衡量指标,就是样本方差,又称可解释性方差,方差越大,特征所带的信息量越多
V a r = 1 n − 1 ∑ ( x i − x ^ ) 2 Var=\frac{1}{n-1}\sum{(x_i-\hat x)^2} Var=n11(xix^)2

2.1 降维究竟怎样实现

sklearn.decomposition.PCA(n_estimators = None, copy = True, whiten = False, svd_solver = ‘auto’, tol = 0.0, iterated_power = ‘auto’, random_state = None)
n维特征矩阵降维的步骤

  • 输入原数据,结构为(m,n),找出原本的n个特征向量构成的n维空间V
  • 决定降维后的特征数量k
  • 通过某种变化,找出n个新的特征向量,以及他们构成的新n维空间V
  • 找出原始数据在新特征空间V中的n个新特征向量上对应的值,即“将数据映射到新空间中”
  • 选取前k个信息量最大的特征,删除没有被选中的特征,成功将n维空间V降为k维
    在步骤3中,用来找出n个新特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解。PCA和SVD是两种不同的降维算法,但两者都遵从上述步骤来实现降维,只是两种算法中矩阵分解的方法不同,信息量的衡量指标不同。
    PCA使用方差作为信息量的衡量指标,并且通过特征值分解来找出空间V。降维时将特征矩阵 X X X分解为 Q ∑ Q − 1 Q\sum Q^{-1} QQ1,其中 Q Q Q Q − 1 Q^{-1} Q1是辅助的矩阵, ∑ \sum 是一个对角矩阵,其对角线上的元素就是方差。降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量被认为信息量很少,这些信息很可能就是噪音。
    SVD使用奇异值分解来找出空间V,将特征矩阵 X X X分解为 U ∑ V T U\sum V^{T} UVT,其中 ∑ \sum 也是一个对角矩阵,不过其对角线上的元素是奇异值,这也是SVD中用来衡量特征上的信息量的指标。 U U U V T V^{T} VT分别是左奇异矩阵和右奇异矩阵,也都是辅助矩阵。
    在数学原理中,无论是PCA和SVD都需要遍历所有的特征和样本来计算信息量指标。并且在矩阵分解的过程之中,会产生比原来的特征矩阵更大的矩阵(如原数据的结构是(m,n),在矩阵分解中为了找出最佳新特征空间V,可能需要产生(n,n),(m,m)大小的矩阵,还需要产生协方差矩阵去计算更多的信息)。而无论是Python还是R,或者其他任何语言,在大型矩阵运算上都不是特别擅长,无论代码如何简化,都需要等待计算机去完成这个非常庞大的数学运算过程,因此,降维算法的计算量很大,运行比较缓慢。
    **思考:PCA和特征选择技术都是特征工程的一部分,它们有什么不同?**特征工程中有是三种方式:特征提取、特征创造和特征选择。特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,依然知道选出的特征在原数据的哪个位置,代表着原数据上的什么含义。而PCA是将已存在的特征进行压缩,降维完毕就的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性,无法判断新特征矩阵的特征是从原数据中的什么特征组合而成,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。以PCA为代表的降维算法因此是特征创造(feature creation或feature construction)的一种。因此,PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,使用特征选择。

2.2 重要参数n_components

n_components是降维后需要的维度,即降维后需要保留的特征数量。降维流程步骤2中需要确定的k值,一般输入 [ 0 , m i n ( X . s h a p e ) ] [0, min(X.shape)] [0,min(X.shape)]范围中的整数。这是一个需要认为去确认的超参数,并且设定的数值会影响到模型的表现。如果留下的特征太多,就达不到降维的效果,如果留下的特征太少,那么新特征向量可能无法包含原始数据集中的大部分信息。
从降维的目标而言,如果希望可视化一组数据来观察数据分布,往往将数据降到三维以下 ,很多时候是二维,即n_components的取值为2。

2.2.1 迷你案例:高维数据的可视化
#调用库和模块
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
#提取数据集
iris = load_iris()
y = iris.target
x = iris.data
x.shape
import pandas as pd
pd.DataFrame(x)
#建模
#调用PCA
pca = PCA(n_components = 2)#实例化
pca = pca.fit(x)#拟合模型
x_dr = pca.transform(x)#获取新矩阵
x_dr
#也可以使用fit_transform一步到位
#x_dr = PCA(2).fit_transform(x)
#要展示三种分类的分布,需要对三种鸢尾花分别绘图
#可以写成三行代码,也可以写成for循环
#plt.figure()#初始化画布
#plt.scatter(x_dr[y == 0,0],x_dr[y == 0,1],c = 'red',label = iris.target_names[0])
#plt.scatter(x_dr[y == 1,0],x_dr[y == 1,1],c = 'black',label = iris.target_names[1])
#plt.scatter(x_dr[y == 2,0],x_dr[y == 2,1],c = 'orange',label = iris.target_names[2])
#plt.legend()
#plt.title("PCA of IRIS dataset")
#plt.show()
colors = ["red","black","orange"]
iris.target_names
plt.figure()
for i in [0,1,2]:
    
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值