【sklearn第二十一讲】矩阵分解问题

机器学习训练营——机器学习爱好者的自由交流空间(qq 群号:696721295)

主成分分析

精确主成分

主成分分析(Principal component analysis, PCA)通常用来分解一个多变量数据集成为逐次正交的成分,这些成分解释原始变量的方差最大。在scikit-learn里,PCA是一个转换对象,在该对象的fit方法里学习n个成分,用于新数据投影到这些成分上,得到新的主成分数据。

设置最优参数whiten=True, 投影数据到奇异空间上,缩放每个主成分为单位方差。在支持向量机和k-means里,这样的参数设置是有利的。

增量主成分

PCA对象虽然有用,但对于大数据集却有些限制。最大的限制是,PCA只支持批量处理,这意味着所有等待处理的数据必须符合主存储器的要求。IncrementalPCA对象使用了一个不同的处理形式,它考虑几乎精确地匹配PCA结果的部分计算,而以一种最小批量的方式处理数据。IncrementalPCA只存储主成分和噪音方差的估计。

随机SVD

通过放弃较小奇异值的主成分的奇异向量,可以实现将数据投射到低维空间,而仍能保持大部分方差的目的。例如,对于 64 × 64 的人脸识别灰度图像,数据的维度是4096, 在这样规模的数据上训练一个RBF支持向量机是很慢的。由于人脸的所有图像看起来相似,所以数据的内在维度远小于4096. PCA算法能够用来线性地转换数据,同时降低维度和保持大部分可解释方差。
PCA类里,当我们想放弃大部分限制计算的奇异向量时,使用参数svd_solver='randomized'是非常有用的。例如,下面显示了来自Olivetti数据集的16个样本肖像。在右边是由前16个奇异向量重新组成的肖像。该数据集的样本数是400, 特征数是4096, 而我们仅仅需要前16个奇异向量来表示,计算时间不到1秒。

这里写图片描述

注意:在设置参数svd_solver=’randomized’时,同时也需要设置低维空间大小参数n_components.

因子分析

在无监督学习里,我们只有一个数据集 X = { x 1 , x 2 , , x n } . 数学上怎样表示这个数据集呢? X 的一个简单的连续隐变量模型是

x i = W h i + μ + ϵ

向量 h i 称为隐藏的,因为它是观测不到的。 ϵ 是一个误差项,通常假定为正态分布,即 ϵ N ( 0 , Ψ ) . μ 是一个任意的offset向量。这样的模型称生成模型(generative model), 它描述 x i 怎样生成自 h i . 如果我们使用所有的 x i s 作为列向量组成矩阵 X , 所有的 h i s 组成矩阵 H , 那么可以表示为

X = W H + M + E

换句话说,我们分解了矩阵 X .

如果给定 h i s , 可以得到下面的概率解释:

P ( x i | h i ) = N ( W h i + μ , Ψ )

对于一个完整的概率模型,我们也需要隐变量 h 的概率分布。最直接的假设是, h N ( 0 , I ) , 这样, x 的边际分布

P ( x ) = N ( μ , W W T + Ψ )

现在,没有进一步的假设,隐变量 h 是多余的, x 能够由均值和协方差阵完全建模。为此,我们需要强加某个特定的结构在这两个参数上。关于 Ψ 的简单假设是:

  • Ψ = σ 2 I 这是PCA的概率模型

  • Ψ = d i a g ( ψ 1 , ψ 2 , , ψ n ) 这是统计里经典的因子分析模型,矩阵 W 称因子载荷阵。

这两种模型实质上都估计了具有低秩协方差阵的正态分布。因子分析能产生类似PCA的成分,但是不能得到任何关于它们的通常的结论,例如,成分之间的正交性。因子分析较PCA的主要优势是,它能独立地建模输入空间在每一个方向上的方差。这样,当噪音存在异方差时,它是更好的模型选择。

这里写图片描述

非负矩阵分解

Frobenius范数的NMF

非负矩阵分解(Non-negative matrix factorization, NMF)应用到的数据矩阵不包括负值,它找到样本 X 的分解:由矩阵 W 和非负元素组成的矩阵 H . 这是通过优化 X 与矩阵乘积 W H 的距离实现的。使用最广泛的距离函数是Frobenius范数,它是欧氏距离到矩阵的推广。

d F r o ( X , Y ) = 1 2 | | X Y | | F r o 2 = 1 2 i , j ( X i j Y i j ) 2

NMF通过添加成分获得一个向量,这种加性模型适合表示图像和文本。下面的例子仍然来自Olivetti人脸数据集,由NMF找到的16个稀疏的成分,对比PCA特征面部。

这里写图片描述

init属性确定了应用的初始化方法,它在很大程度上影响NMF的表现。在NMF里,也可以加入L1 and L2先验到损失函数,正则化模型。

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)

阅读更多精彩内容,请关注微信公众号:统计学习与大数据

猜你喜欢

转载自blog.csdn.net/wong2016/article/details/81141990