【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题) - 无监督学习 - 用户指南 | ApacheCN

时间:2022-04-21
本文章向大家介绍【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题) - 无监督学习 - 用户指南 | ApacheCN,主要内容包括2.5. 分解成分中的信号(矩阵分解问题)、2.5.2. 截断奇异值分解和隐语义分析、2.5.3. 词典学习、2.5.4. 因子分析、2.5.5. 独立成分分析(ICA)、2.5.6. 非负矩阵分解(NMF 或 NNMF)、2.5.7. 隐 Dirichlet 分配(LDA)、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

2.5. 分解成分中的信号(矩阵分解问题)

2.5.1. 主成分分析(PCA)

2.5.1.1. 准确的PCA和概率解释(Exact PCA and probabilistic interpretation)

PCA 用于对一组连续正交分量中的多变量数据集进行方差最大方向的分解。 在 scikit-learn 中, PCA 被实现为一个变换对象, 通过 fit 方法可以降维成 n 个成分, 并且可以将新的数据投影(project, 亦可理解为分解)到这些成分中。

可选参数 whiten=True 使得可以将数据投影到奇异(singular)空间上,同时将每个成分缩放到单位方差。 如果下游模型对信号的各向同性作出强烈的假设,这通常是有用的,例如,使用RBF内核的 SVM 算法和 K-Means 聚类算法。

以下是iris数据集的一个示例,该数据集包含4个特征, 通过PCA降维后投影到方差最大的二维空间上:

PCA 对象还提供了 PCA 的概率解释, 其可以基于其解释的方差量给出数据的可能性。

可以通过在交叉验证(cross-validation)中使用 score 方法来实现:

例子:

2.5.1.2. 增量PCA (Incremental PCA)

PCA 对象非常有用, 但对大型数据集有一定的限制。 最大的限制是 PCA 仅支持批处理,这意味着所有要处理的数据必须适合主内存。 IncrementalPCA 对象使用不同的处理形式使之允许部分计算, 这一形式几乎和 PCA 以小型批处理方式处理数据的方法完全匹配。 IncrementalPCA 可以通过以下方式实现核外(out-of-core)主成分分析:

  • 使用 partial_fit 方法从本地硬盘或网络数据库中以此获取数据块。
  • 通过 numpy.memmap 在一个 memory mapped file 上使用 fit 方法。

IncrementalPCA 仅存储成分和噪声方差的估计值,并按顺序递增地更新解释方差比(explained_variance_ratio_)。

这就是为什么内存使用取决于每个批次的样本数,而不是数据集中要处理的样本数。

Examples:

2.5.1.3. PCA 使用随机SVD

通过丢弃具有较低奇异值的奇异向量成分,将数据降维到低维空间并保留大部分方差是非常有意义的。

例如,如果我们使用64x64像素的灰度级图像进行人脸识别,数据的维数为4096, 在这样大的数据上训练含RBF内核的支持向量机是很慢的。 此外我们知道数据本质上的维度远低于4096,因为人脸的所有照片都看起来有点相似。 样本位于许多的很低维度(例如约200维)。PCA算法可以用于线性变换数据,同时降低维数并同时保留大部分方差。

在这种情况下,使用可选参数 svd_solver='randomized' 的 PCA 是非常有用的。 因为我们将要丢弃大部分奇异值,所以对我们将保留并实际执行变换的奇异向量进行近似估计的有限的计算更有效。

例子:

参考文献:

2.5.1.4. 核 PCA

KernelPCA 是 PCA 的扩展,通过使用核方法实现非线性降维(dimensionality reduction) (参阅 成对的矩阵, 类别和核函数)。 它具有许多应用,包括去噪, 压缩和结构化预测( structured prediction ) (kernel dependency estimation(内核依赖估计))。

KernelPCA 支持 transform 和 inverse_transform 。

示例:

2.5.1.5. 稀疏主成分分析 ( SparsePCA 和 MiniBatchSparsePCA )

SparsePCA 是 PCA 的一个变体,目的是提取能最好地重建数据的稀疏组分集合。

小批量稀疏 PCA ( MiniBatchSparsePCA ) 是一个 SparsePCA 的变种,它速度更快但准确度有所降低。对于给定的迭代次数,通过迭代该组特征的小块来达到速度的增加。

Principal component analysis(主成分分析) (PCA) 的缺点在于,通过该方法提取的成分具有唯一的密度表达式,即当表示为原始变量的线性组合时,它们具有非零系数,使之难以解释。在许多情况下,真正的基础组件可以更自然地想象为稀疏向量; 例如在面部识别中,每个组件可能自然地映射到面部的某个部分。

稀疏的主成分产生更简洁、可解释的表达式,明确强调了样本之间的差异性来自哪些原始特征。

示例:

参考文献:

2.5.2. 截断奇异值分解和隐语义分析

虽然 TruncatedSVD 转换器(transformer)可以在任何(稀疏的)特征矩阵上工作,但还是建议在 LSA/document 处理设置中,在 tf–idf 矩阵上的原始频率计数使用它。 特别地,应该打开子线性缩放(sublinear scaling)和逆文档频率(inverse document frequency) (sublinear_tf=True, use_idf=True) 以使特征值更接近于高斯分布,补偿 LSA 对文本数据的错误假设。

示例:

参考文献:

2.5.3. 词典学习

2.5.3.1. 带有预计算词典的稀疏编码

SparseCoder 对象是一个估计器 (estimator),可以用来将信号转换成一个固定的预计算的词典内原子(atoms)的稀疏线性组合(sparse linear combination),如离散小波基( discrete wavelet basis ) 。 因此,该对象不实现 fit 方法。该转换相当于一个稀疏编码问题: 将数据的表示为尽可能少的词典原子的线性组合。 词典学习的所有变体实现以下变换方法,可以通过 transform_method 初始化参数进行控制:

  • Orthogonal matching pursuit(追求正交匹配) (正交匹配追踪法(OMP))
  • Least-angle regression (最小角度回归)(最小角回归)
  • Lasso computed by least-angle regression(最小角度回归的Lasso 计算)
  • Lasso using coordinate descent ( 使用坐标下降的Lasso)(Lasso)
  • Thresholding(阈值)

阈值方法速度非常快,但是不能产生精确的重建。 它们在分类任务的文献中已被证明是有用的。对于图像重建任务,追求正交匹配可以产生最精确、无偏的重建。

词典学习对象通过 split_code 参数提供稀疏编码结果中的正值和负值分离的可能性。当使用词典学习来提取将用于监督学习的特征时,这是有用的,因为它允许学习算法将不同的权重从正加载(loading)分配给相应的负加载的特定原子。

单个样本的分割编码具有长度 2 * n_components ,并使用以下规则构造: 首先,计算长度为 n_components 的常规编码。然后, split_code 的第一个 n_components 条目将用正常编码向量的正部分填充。分割编码的第二部分用编码向量的负部分填充,只有一个正号。因此, split_code 是非负的。

示例:

2.5.3.2. 通用词典学习

词典学习( DictionaryLearning ) 是一个矩阵因式分解问题,相当于找到一个在拟合数据的稀疏编码中表现良好的(通常是过完备的(overcomplete))词典。

将数据表示为来自过完备词典的原子的稀疏组合被认为是哺乳动物初级视觉皮层的工作方式。 因此,应用于图像补丁的词典学习已被证明在诸如图像完成、修复和去噪,以及有监督的识别图像处理任务中表现良好的结果。

词典学习是通过交替更新稀疏编码来解决的优化问题,作为解决多个 Lasso 问题的一个解决方案,考虑到字典固定,然后更新字典以最好地适合稀疏编码。

在使用这样一个过程来拟合词典之后,变换只是一个稀疏的编码步骤,与所有的词典学习对象共享相同的实现。(参见 带有预计算词典的稀疏编码)。

以下图像显示了字典学习是如何从浣熊脸部的部分图像中提取的4x4像素图像补丁中进行词典学习的。

示例:

参考文献:

2.5.3.3. 小批量字典学习

MiniBatchDictionaryLearning 实现了更快、更适合大型数据集的字典学习算法,其运行速度更快,但准确度有所降低。

默认情况下,MiniBatchDictionaryLearning 将数据分成小批量,并通过在指定次数的迭代中循环使用小批量,以在线方式进行优化。但是,目前它没有实现停止条件。

估计器还实现了 partial_fit, 它通过在一个小批处理中仅迭代一次来更新字典。 当在线学习的数据从一开始就不容易获得,或者数据超出内存时,可以使用这种迭代方法。

字典学习聚类

注意,当使用字典学习来提取表示(例如,用于稀疏编码)时,聚类可以是学习字典的良好中间方法。 例如,MiniBatchKMeans 估计器能高效计算并使用 partial_fit 方法实现在线学习。

示例: 在线学习面部部分的字典 Online learning of a dictionary of parts of faces

2.5.4. 因子分析

因子分析( PCA ) 的主要优点是可以独立地对输入空间的每个方向(异方差噪声)的方差建模:

在异方差噪声存在的情况下,这可以比概率 PCA 作出更好的模型选择:

示例:

2.5.5. 独立成分分析(ICA)

独立分量分析将多变量信号分解为独立性最强的加性子组件。 它通过 Fast ICA 算法在 scikit-learn 中实现。 ICA 通常不用于降低维度,而是用于分离叠加信号。 由于 ICA 模型不包括噪声项,因此要使模型正确,必须使用白化。 这可以在内部调节白化参数或手动使用 PCA 的一种变体。

ICA 通常用于分离混合信号(称为 盲源分离 的问题),如下例所示:

ICA 也可以用于具有稀疏子成分的非线性分解:

示例:

2.5.6. 非负矩阵分解(NMF 或 NNMF)

2.5.6.1. NMF 与 Frobenius 范数

与 PCA 不同,通过叠加分量而不减去,以加法方式获得向量的表示。这种加性模型对于表示图像和文本是有效的。

[Hoyer, 2004] [2] 研究表明,当处于一定约束时,NMF 可以产生数据集基于某子部分的表示,从而获得可解释的模型。

以下示例展示了与 PCA 特征面相比, NMF 从 Olivetti 面部数据集中的图像中发现的16个稀疏组件。

Unlike PCA, the representation of a vector is obtained in an additive fashion, by superimposing the components, without subtracting. Such additive models are efficient for representing images and text.

init 属性确定了应用的初始化方法,这对方法的性能有很大的影响。 NMF 实现了非负双奇异值分解方法。NNDSVD [4] 基于两个 SVD 过程,一个近似数据矩阵, 使用单位秩矩阵的代数性质,得到的部分SVD因子的其他近似正部分。 基本的 NNDSVD 算法更适合稀疏分解。其变体 NNDSVDa(全部零值替换为所有元素的平均值)和 NNDSVDar(零值替换为比数据平均值除以100小的随机扰动)在稠密情况时推荐使用。

请注意,乘法更新 (‘mu’) 求解器无法更新初始化中存在的零,因此当与引入大量零的基本 NNDSVD 算法联合使用时, 会导致较差的结果; 在这种情况下,应优先使用 NNDSVDa 或 NNDSVDar。

也可以通过设置 init="random",使用正确缩放的随机非负矩阵初始化 NMF 。 整数种子或 RandomState 也可以传递给 random_state 以控制重现性。

或者, Itakura-Saito(IS) divergence:

这三个距离函数是 beta-divergence 函数族的特殊情况,其参数分别为 

[6] 。 beta-divergence 定义如下:

‘cd’ 求解器只能优化 Frobenius 范数。由于 NMF 的潜在非凸性,即使优化相同的距离函数, 不同的求解器也可能会收敛到不同的最小值。

NMF最适用于 fit_transform 方法,该方法返回矩阵W.矩阵 H 被 components_ 属性中存储到拟合模型中; 方法 transform 将基于这些存储的组件分解新的矩阵 X_new:

>>>

>>> import numpy as np
>>> X = np.array([[1, 1], [2, 1], [3, 1.2], [4, 1], [5, 0.8], [6, 1]])
>>> from sklearn.decomposition import NMF
>>> model = NMF(n_components=2, init='random', random_state=0)
>>> W = model.fit_transform(X)
>>> H = model.components_
>>> X_new = np.array([[1, 0], [1, 6.1], [1, 0], [1, 4], [3.2, 1], [0, 4]])
>>> W_new = model.transform(X_new)

示例:

参考文献:

2.5.7. 隐 Dirichlet 分配(LDA)

隐 Dirichlet 分配是离散数据集(如文本语料库)的集合的生成概率模型。 它也是一个主题模型,用于从文档集合中发现抽象主题。

LDA 的图形模型是一个三层贝叶斯模型:

LatentDirichletAllocation 实现在线变体贝叶斯算法,支持在线和批量更新方法。 批处理方法在每次完全传递数据后更新变分变量,在线方法从小批量数据点中更新变体变量。

Note

虽然在线方法保证收敛到局部最优点,最优点的质量和收敛速度可能取决于与小批量大小和学习率相关的属性。

当 LatentDirichletAllocation 应用于 “document-term” 矩阵时,矩阵将被分解为 “topic-term” 矩阵和 “document-topic” 矩阵。 虽然 “topic-term” 矩阵在模型中被存储为 components_ ,但是可以通过 transform 方法计算 “document-topic” 矩阵。

LatentDirichletAllocation 还实现了 partial_fit 方法。这可用于当数据被顺序提取时.

示例:

参考:

中文文档: http://sklearn.apachecn.org/cn/stable/modules/decomposition.html

英文文档: http://sklearn.apachecn.org/en/stable/modules/decomposition.html

官方文档: http://scikit-learn.org/stable/

GitHub: https://github.com/apachecn/scikit-learn-doc-zh(觉得不错麻烦给个 Star,我们一直在努力)

贡献者: https://github.com/apachecn/scikit-learn-doc-zh#贡献者

关于我们: http://www.apachecn.org/organization/209.html

有兴趣的们也可以和我们一起来维护,持续更新中 。。。

机器学习交流群: 629470233