机器学习训练营——机器学习爱好者的自由交流空间(qq 群号:696721295)
主成分分析
精确主成分
主成分分析(Principal component analysis, PCA)通常用来分解一个多变量数据集成为逐次正交的成分,这些成分解释原始变量的方差最大。在scikit-learn里,PCA是一个转换对象,在该对象的fit
方法里学习n个成分,用于新数据投影到这些成分上,得到新的主成分数据。
设置最优参数whiten=True
, 投影数据到奇异空间上,缩放每个主成分为单位方差。在支持向量机和k-means里,这样的参数设置是有利的。
增量主成分
PCA对象虽然有用,但对于大数据集却有些限制。最大的限制是,PCA只支持批量处理,这意味着所有等待处理的数据必须符合主存储器的要求。IncrementalPCA
对象使用了一个不同的处理形式,它考虑几乎精确地匹配PCA结果的部分计算,而以一种最小批量的方式处理数据。IncrementalPCA只存储主成分和噪音方差的估计。
随机SVD
通过放弃较小奇异值的主成分的奇异向量,可以实现将数据投射到低维空间,而仍能保持大部分方差的目的。例如,对于
的人脸识别灰度图像,数据的维度是4096, 在这样规模的数据上训练一个RBF支持向量机是很慢的。由于人脸的所有图像看起来相似,所以数据的内在维度远小于4096. PCA算法能够用来线性地转换数据,同时降低维度和保持大部分可解释方差。
在PCA
类里,当我们想放弃大部分限制计算的奇异向量时,使用参数svd_solver='randomized'
是非常有用的。例如,下面显示了来自Olivetti数据集的16个样本肖像。在右边是由前16个奇异向量重新组成的肖像。该数据集的样本数是400, 特征数是4096, 而我们仅仅需要前16个奇异向量来表示,计算时间不到1秒。
注意:在设置参数svd_solver=’randomized’时,同时也需要设置低维空间大小参数n_components.
因子分析
在无监督学习里,我们只有一个数据集
. 数学上怎样表示这个数据集呢?
的一个简单的连续隐变量模型是
向量
称为隐藏的,因为它是观测不到的。
是一个误差项,通常假定为正态分布,即
.
是一个任意的offset向量。这样的模型称生成模型(generative model), 它描述
怎样生成自
. 如果我们使用所有的
作为列向量组成矩阵
, 所有的
组成矩阵
, 那么可以表示为
换句话说,我们分解了矩阵 .
如果给定
, 可以得到下面的概率解释:
对于一个完整的概率模型,我们也需要隐变量 的概率分布。最直接的假设是, , 这样, 的边际分布
现在,没有进一步的假设,隐变量 是多余的, 能够由均值和协方差阵完全建模。为此,我们需要强加某个特定的结构在这两个参数上。关于 的简单假设是:
这是PCA的概率模型
这是统计里经典的因子分析模型,矩阵 称因子载荷阵。
这两种模型实质上都估计了具有低秩协方差阵的正态分布。因子分析能产生类似PCA的成分,但是不能得到任何关于它们的通常的结论,例如,成分之间的正交性。因子分析较PCA的主要优势是,它能独立地建模输入空间在每一个方向上的方差。这样,当噪音存在异方差时,它是更好的模型选择。
非负矩阵分解
Frobenius范数的NMF
非负矩阵分解(Non-negative matrix factorization, NMF)应用到的数据矩阵不包括负值,它找到样本 的分解:由矩阵 和非负元素组成的矩阵 . 这是通过优化 与矩阵乘积 的距离实现的。使用最广泛的距离函数是Frobenius范数,它是欧氏距离到矩阵的推广。
NMF通过添加成分获得一个向量,这种加性模型适合表示图像和文本。下面的例子仍然来自Olivetti人脸数据集,由NMF找到的16个稀疏的成分,对比PCA特征面部。
init
属性确定了应用的初始化方法,它在很大程度上影响NMF的表现。在NMF里,也可以加入L1 and L2先验到损失函数,正则化模型。
NMF最好使用fit_transform
方法,它返回矩阵
. 矩阵
存储在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)
阅读更多精彩内容,请关注微信公众号:统计学习与大数据