主成分分析(PCA)
准确的PCA和概率解释
PCA用于分解解释最大量方差的一组连续正交分量中的多变量数据集。在scikit学习中,PCA
被实现为一个变换对象, 它fit
可以在其方法中学习组件,并且可以使用新的数据来对这些组件进行投射。
可选参数whiten=True
使得可以将数据投影到单个空间上,同时将每个组件缩放到单位方差。如果下游模型对信号的各向同性作出强烈的假设,这通常是有用的:例如,具有RBF内核和K-Means聚类算法的支持向量机的情况。
以下是虹膜数据集的一个例子,它由4个特征组成,它们在二维上预测出可以解释大多数方差:
该PCA
对象还提供了PCA的概率解释,其可以基于其解释的方差量给出数据的可能性。因此,它实现了可用于交叉验证的 分数方法:
例子:
增量PCA
该PCA
对象非常有用,但对大型数据集有一定限制。最大的限制是PCA
仅支持批处理,这意味着所有要处理的数据必须适合主内存。该IncrementalPCA
对象使用不同的处理形式,并且允许部分计算几乎完全匹配PCA
以小型存储方式处理数据的结果。IncrementalPCA
可以通过以下方式实现核心主成分分析:
partial_fit
在本地硬盘驱动器或网络数据库中依次获取的数据块使用其方法。- 使用内存映射文件调用其拟合方法
numpy.memmap
。
IncrementalPCA
仅存储组件和噪声方差的估计,按顺序更新explained_variance_ratio_
。这就是为什么内存使用取决于每个批次的样本数,而不是数据集中要处理的样本数。
例子:
PCA使用随机SVD
通过丢弃与较低奇异值相关联的分量的奇异向量,将数据投影到保留大部分方差的较低维空间是非常有意义的。
例如,如果我们使用64x64像素的灰度级图像进行面部识别,数据的维数为4096,并且在这样大的数据上训练RBF支持向量机是很慢的。此外,我们知道数据的固有维度远低于4096,因为人脸的所有照片都看起来有点相似。样品位于较低维度的歧管上(例如约200)。PCA算法可以用于线性变换数据,同时降低维数并同时保留大部分解释的方差。
PCA
与可选参数一起使用 的类svd_solver='randomized'
在这种情况下非常有用:因为我们将要删除大部分奇异向量,所以将计算限制为单个向量的近似估计更有效,我们将保持实际执行变换。
例如,以下显示了来自Olivetti数据集的16个样本肖像(以0.0为中心)。右侧是重画为肖像的前16个奇异矢量。因为我们只需要使用大小的数据集的前16名奇异向量
和 ,计算时间小于1秒:
注意:使用可选参数svd_solver='randomized'
,我们还需要PCA
将低维空间的大小 n_components
作为必需的输入参数。
随机的内存占用量PCA
也正比于 代替 的确切方法。
注:执行inverse_transform
中PCA
有 svd_solver='randomized'
不准确的逆变换 transform
,即使whiten=False
(默认)。
参考文献:
- “随机搜索结构:构造近似矩阵分解的随机算法” Halko等,2009
内核PCA
KernelPCA
是PCA的扩展,通过使用内核实现非线性维数降低(参见Pairwise metrics,Affinities and Kernels)。它具有许多应用,包括去噪,压缩和结构预测(内核依赖估计)。KernelPCA
支持 transform
和inverse_transform
。
例子:
稀疏主成分分析(SparsePCA和MiniBatchSparsePCA)
SparsePCA
是PCA的一个变体,其目标是提取最能重建数据的稀疏分量集合。
迷你批量稀疏PCA(MiniBatchSparsePCA
)是一种SparsePCA
更快,但不太准确的变体 。对于给定的迭代次数,通过迭代该组特征的小块来达到增加的速度。
主成分分析(PCA
)具有以下缺点:通过该方法提取的分量具有唯一的密集表达式,即当以原始变量的线性组合表示时,它们具有非零系数。这可以使解释变得困难。在许多情况下,真正的基础组件可以更自然地想象为稀疏向量; 例如在面部识别中,组件可能自然地映射到面部的部分。
稀疏的主成分产生更简洁,可解释的表示,明确强调哪些原始特征有助于样本之间的差异。
以下示例说明了使用Olivetti面数据集中的稀疏PCA提取的16个组件。可以看出正则化术语如何引发许多零。此外,数据的自然结构导致非零系数垂直相邻。该模型不会在数学上强制执行:每个组件都是一个向量[Jen09]审查这些方法。
,并且没有垂直相邻性的概念,除非在人性化的可视化期间为64x64像素图像。下面显示的组件出现局部的事实是数据的固有结构的影响,这使得这种局部模式使重建误差最小化。存在考虑到邻接和不同类型结构的稀疏诱导规范; 见
请注意,稀疏PCA问题有许多不同的配方。这里实施的是基于[Mrl09]。解决的优化问题是PCA问题(字典学习), 对组件有 惩罚:
alpha
。小值导致了温和的正则化因式分解,而较大的值将许多系数缩小到零。
注意
虽然本着在线算法的精神,该类 MiniBatchSparsePCA
不实现,partial_fit
因为算法沿着特征方向在线,而不是样本方向。
例子:
参考文献:
[Mrl09] | “稀疏编码的在线词典学习” J. Mairal,F. Bach,J. Ponce,G. Sapiro,2009 |
[Jen09] | “结构稀疏主成分分析” R. Jenatton,G.Obozinski,F.Bach,2009 |
截断的奇异值分解和潜在语义分析
TruncatedSVD
实现仅计算 最大奇异值的奇异值分解(SVD)的变体,其中 是用户指定的参数。
当将截断的SVD应用于术语文档矩阵(由CountVectorizer
or 返回TfidfVectorizer
)时,该变换被称为 潜在语义分析(LSA),因为它将这样的矩阵转换为低维度的“语义”空间。特别地,LSA已知能够抵抗同义词和多义词的影响(这两者大致意味着每个单词有多重含义),这导致术语文档矩阵过度稀疏,并且在诸如余弦相似性的度量下表现出差的相似性。
注意
LSA也被称为潜在语义索引LSI,尽管严格地说它是指在持久索引中用于信息检索的目的。
在数学上,应用于训练样本的截断SVD
产生低阶逼近 :在这个操作之后,n_components
在API中调用)。
为了也转换一个测试集
,我们将它与 :注意
自然语言处理(NLP)和信息检索(IR)文献中的LSA的大多数处理交换矩阵的轴n_features
×n_samples
。我们以与Scikit-learn API相匹配的不同方式提供LSA,但是找到的奇异值是相同的。
TruncatedSVD
非常相似PCA
,但不同之处在于,它 直接用于样本矩阵而不是协方差矩阵。当 从特征值中减去逐列(每特征)手段时,得到的矩阵上的截断SVD等同于PCA。实际上,这意味着TruncatedSVD
变压器接受scipy.sparse
矩阵,而不需要对它们进行致密化,因为即使对于中型文档集合,致密化也可能填满记忆。
当TruncatedSVD
变压器与任何(稀疏)特征矩阵一起使用时,建议在LSA /文档处理设置中的原始频率计数上使用tf-idf矩阵。特别地,应该打开子线性缩放和逆文档频率以使特征值更接近高斯分布,从而补偿LSA对文本数据的错误假设。sublinear_tf=True, use_idf=True
参考文献:
- Christopher D. Manning,Prabhakar Raghavan和HinrichSchütze(2008), “信息检索简介”,剑桥大学出版社,第18章:矩阵分解和潜在语义索引
词典学习
用预先计算的字典稀疏编码
该SparseCoder
对象是可用于将信号转换成来自固定的预计算字典(例如离散小波基)的原子的稀疏线性组合的估计器。因此,该对象不实现fit
方法。该转换相当于稀疏编码问题:将数据的表示尽可能少的字典原子的线性组合。字典学习的所有变体实现以下变换方法,可通过transform_method
初始化参数进行控制:
- 正交匹配追踪(正交匹配追踪(OMP))
- 最小角度回归(最小角度回归)
- Lasso通过最小角度回归计算
- Lasso使用坐标下降(Lasso)
- 阈值
阈值非常快,但不能产生精确的重建。它们在分类任务的文献中已被证明是有用的。对于图像重建任务,正交匹配追求产生最准确,无偏见的重建。
字典学习对象通过split_code
参数提供在稀疏编码结果中分离正值和负值的可能性。当使用字典学习来提取将用于监督学习的特征时,这是有用的,因为它允许学习算法将不同的权重分配给特定原子的负负荷,从相应的正负载。
单个样本的分割代码具有长度, 并使用以下规则构建:首先计算长度的常规代码 。然后,第一个条目 填充了常规代码向量的正部分。分割代码的后半部分填充有代码矢量的负部分,只有一个正号。因此,split_code是非负数。2 * n_components
n_components
n_components
split_code
例子:
通用词典学习
词典学习(DictionaryLearning
)是一个矩阵因式分解问题,相当于找到一个(通常是不完整的)字典,它将对拟合的数据进行稀疏编码。
将数据表示为来自过度完整字典的稀疏组合的原子被认为是哺乳动物初级视觉皮层的工作方式。因此,应用于图像补丁的字典学习已被证明在诸如图像完成,修复和去噪以及监督识别任务的图像处理任务中给出良好的结果。
词典学习是通过交替更新稀疏代码解决的优化问题,作为解决多个Lasso问题的一个解决方案,考虑到字典固定,然后更新字典以最适合稀疏代码。
在使用这样一个过程来拟合字典之后,变换只是一个稀疏编码步骤,与所有字典学习对象共享相同的实现(参见使用预计算字典的稀疏编码)。
以下图像显示了从浣熊脸部图像中提取的4x4像素图像补丁中学习的字典如何。
例子:
参考文献:
- “稀疏编码的在线词典学习” J.Mairal,F.Bach,J. Ponce,G.Sapiro,2009
小批量字典学习
MiniBatchDictionaryLearning
实现更适合大型数据集的字典学习算法的更快,但不太准确的版本。
默认情况下,MiniBatchDictionaryLearning
将数据分成小批量,并通过在指定次数的迭代中循环使用小批量,以在线方式进行优化。但是,目前它没有实现停止条件。
估计器还实现了它partial_fit
,它通过在一个迷你批次中迭代一次来更新字典。当数据从一开始就不容易获得,或数据不适合内存时,这可以用于在线学习。
字典学习聚类
请注意,当使用字典学习提取表示(例如稀疏编码)时,聚类可以成为学习字典的好代理。例如,MiniBatchKMeans
估计器在计算上是有效的,并通过一种partial_fit
方法实现在线学习 。
示例:在线学习面部部分的字典
因子分析
在无监督的学习中,我们只有一个数据集
。这个数据如何在数学上描述?一个非常简单的 连续潜变量的模型 是该矢量
被称为“潜在”,因为它是不可观察的。 被认为是根据具有平均值0和协方差 (即 )的高斯分布的噪声项, 是一些任意的偏移向量。这样的模型被称为“生成”,因为它描述了如何 从中生成 。如果我们使用所有的 列作为矩阵, 并将所有的 列作为矩阵的列, 那么我们可以写(适当地定义 和 ):换句话说,我们分解矩阵
。如果
给出,上述方程自动暗示以下概率解释:对于一个完整的概率模型,我们还需要潜在变量的先前分布
。最直接的假设(基于高斯分布的不同属性)是 。这产生一个高斯作为边际分布 :现在,没有任何进一步的假设,具有潜在变量的想法
将是多余的 - 可以用平均和协方差来完全建模。我们需要对这两个参数之一施加一些更具体的结构。一个简单的附加假设是误差协方差的结构 :PCA
。 :这个假设导致了概率模型FactorAnalysis
经典的统计模型。矩阵W有时称为“因子加载矩阵”。 :这个模型叫做
两个模型基本上估计出具有低阶协方差矩阵的高斯。因为这两个模型都是概率性的,所以它们可以集成到更复杂的模型中,例如因子分析仪的混合。FastICA
如果假设潜在变量上的非高斯先验,则得到非常不同的模型(例如 )。
因子分析可以产生类似的组件(其加载矩阵的列)PCA
。然而,不能对这些组件做出任何一般性的说明(例如它们是否是正交的):
因子分析的主要优点(PCA
结论是它可以独立地对输入空间的每个方向的模型进行建模(异方差噪声):
在异方差噪声的存在下,这样可以比概率PCA更好的模型选择:
例子:
独立成分分析(ICA)
独立分量分析将多变量信号分解为最大独立的加性子组件。它使用 算法在scikit学习中实现。通常,ICA不用于降低维度,而是用于分离叠加信号。由于ICA模型不包括噪声项,因此,为了使模型正确,必须应用美白。这可以在内部使用whiten参数或手动使用其中一种PCA变体进行。Fast ICA
通常用于分离混合信号(称为盲源分离的问题 ),如下例所示:
ICA也可以用作另一种非线性分解,可以找到具有一些稀疏性的组件:
例子:
非负矩阵分解(NMF或NNMF)
NMF
是分解的另一种方法,它假定数据和组件是非负的。在数据矩阵不包含负值的情况下,NMF
可以插入而不是PCA
其变体。它通过对平方Frobenius范数进行优化,发现样本分解 成两个矩阵 和 非负元素:
这个规范是欧几里得规范到矩阵的一个明显的扩展。(NMF文献中已经提出了其他优化目标,尤其是Kullback-Leibler分歧,但目前尚未实施。)
不同PCA
的是,通过叠加分量而不加减去,以相加的方式获得向量的表示。这种添加剂模型对于表示图像和文本是有效的。
在[Hoyer,04]中已经观察到,当被仔细约束时, NMF
可以产生数据集的基于零件的表示,导致可解释的模型。以下示例显示NMF
了与PCA特征面相比,从Olivetti面数据集中的图像中找到的16个稀疏组件。
该init
属性决定了应用的初始化方法,对方法的性能有很大的影响。NMF
实现非负双奇异值分解方法。NNDSVD基于两个SVD过程,一个近似数据矩阵,使用单位秩矩阵的代数性质,得到的部分SVD因子的其他近似正部分。基本的NNDSVD算法更适合稀疏分解。其变体NNDSVDa(其中所有零被设置为等于数据的所有元素的平均值)和NNDSVDar(其中将零设置为小于数据平均值的随机扰动除以100)在密集案件。
NMF
也可以通过设置通过正确缩放的随机非负矩阵进行初始化init="random"
。整数种子 RandomState
也可以传递random_state
到控制重现性。
在NMF
L1和L2先验可以添加到损失函数,以使模型正规化。L2之前使用Frobenius标准,而L1先验使用元素L1范数。如ElasticNet
,我们控制L1和L2的与所述组合l1_ratio
( )参数,并与正则化强度alpha
( )参数。那么先修课程是:
正则化的目标函数是:
NMF
正则化W和H.公共功能 non_negative_factorization
允许通过regularization
属性进行更精细的控制 ,并且可以仅将W,仅H或两者正规化。
例子:
参考文献:
- “通过非负矩阵分解学习对象的部分” D.Lee,S.Sung,1999
- “非负矩阵因子分解与稀疏约束” P. Hoyer,2004
- “非负矩阵分解的投影梯度法” C.-J。林,2007
- “基于SVD的初始化:非负矩阵分解的开始” C. Boutsidis,E.Gallopoulos,2008
- “用于大规模非负矩阵和张量因子分解的快速本地算法” A. Cichocki,P. Anh-Huy,2009
潜在Dirichlet分配(LDA)
潜在Dirichlet分配是离散数据集(如文本语料库)的集合的生成概率模型。它也是一个主题模型,用于从文档集合中发现抽象主题。
LDA的图形模型是一个三级贝叶斯模型:
当建模文本语料库时,该模型假设具有
文档和 主题的语料库的以下生成过程:- 绘制每个主题
- 对于每个文件 ,绘制
- 对于
- 绘制主题索引
- 画出观察字
文档中的每个单词 :
对于参数估计,后验分布为:
由于后部是顽固性,变分贝叶斯方法使用简单的分布
来近似它,那些变参数 , , 被优化以最大化束缚证据下(ELBO):最大化ELBO相当于最小化Kullback-Leibler(KL)之间的差异
和真正的后验 。LatentDirichletAllocation
实现在线变分贝叶斯算法,并支持在线和批量更新方法。批处理方法在每次完全传递数据后更新变分变量,联机方法从微型批量数据点更新变分变量。
注意: 虽然在线方法保证收敛到局部最优点,但最优点的质量和收敛速度可能取决于小批量大小和学习率设置相关的属性。
当LatentDirichletAllocation
应用于“文档术语”矩阵时,矩阵将被分解为“主题术语”矩阵和“文档主题”矩阵。虽然“主题”矩阵存储components_
在模型中,但是可以通过transform
方法计算“文档主题”矩阵。
LatentDirichletAllocation
也实现partial_fit
方法。当数据可以顺序提取时使用。
参考文献:
- “潜在的Dirichlet分配” D.Blei,A. Ng,M. Jordan,2003
- “潜在Dirichlet分配的在线学习” M. Hoffman,D.Blei,F. Bach,2010
- “随机变量推论” M.霍夫曼,D.Blei,C. Wang,J.佩斯利,2013年