sklearn.manifold(流式学习)模块结构及用法||LLE参数、属性、方法详解

manifold learning流形学习是一种非线性降维的手段。

这项工作的算法基于以下想法:很多数据集的维度只是人为的高。

​ 多维度数据集非常难于可视化。反而2维或者3维数据很容易通过图表展示数据本身的内部结构,等价的高维绘图就远没有那么直观了。为了实现数据集结构的可视化,数据的维度必须通过某种方式降维。

​ 最简单的降维手段是数据的随机投影。虽然这种方式实现一定程度的数据结构可视化,但是选择的随意性导致结果远不如意。在随机投影中,更有趣的结构容易丢失。

​ 为了解决这种问题,人们设计了一系列监督或非监督的线性降维框架,例如Principal Component Analysis(PCA,主成分分析)、Independent Component Analysis(独立成分分析)、 Linear Discriminant Analysis(线性判别分析)…这些算法定义了特殊的评估量用于多维数据选择有趣的线性投影,这些手段是有效的,不过经常会错失数据结构中的非线性项

​ Manifold Learing可以看作一种生成类似PCA的线性框架,不同的是可以对数据中的非线性结构敏感。虽然存在监督变体,但是典型的流式学习问题是非监督的:它从数据本身学习高维结构,不需要使用既定的分类。

例子:

  • 请参阅手写数字上的流形学习:局部线性嵌入,Isomap …以获取手写数字降维的示例。
  • 有关玩具“S曲线”数据集上降维的示例,请参阅流形学习方法的比较。
  • 模块内的常用类及函数

类:

class 解释 解释
manifold.Isomap([n_neighbors, n_components, …]) Isomap Embedding 等距映射
manifold.LocallyLinearEmbedding([…]) Locally Linear Embedding 局部线性嵌入
manifold.MDS([n_components, metric, n_init, …]) Multidimensional scaling 多维尺度变换
manifold.SpectralEmbedding([n_components, …]) Spectral embedding for non-linear dimensionality reduction. 拉普拉斯特征映射
manifold.TSNE([n_components, perplexity, …]) t-distributed Stochastic Neighbor Embedding. T-SNE

函数:

function 解释
manifold.locally_linear_embedding(X, …[, …]) Perform a Locally Linear Embedding analysis on the data.
manifold.smacof(dissimilarities[, metric, …]) Computes multidimensional scaling using the SMACOF algorithm.
manifold.spectral_embedding(adjacency[, …]) Project the sample on the first eigenvectors of the graph Laplacian.
  • sklearn.manifold.LocallyLinearEmbedding(局部线性嵌入) 官方文档

class sklearn.manifold.LocallyLinearEmbedding(n_neighbors=5, n_components=2, reg=0.001, eigen_solver=’auto’, tol=1e-06, max_iter=100, method=’standard’, hessian_tol=0.0001, modified_tol=1e-12, neighbors_algorithm=’auto’, random_state=None, n_jobs=None)

局部线性嵌入(LLE)通过保留局部邻域内的距离来寻求数据的低维投影。 它可以被认为是一系列的局部主成分分析,与全局相比,找到最优的局部非线性嵌入。

面向对象:sklearn.manifold.LocallyLinearEmbedding类的实例化

面向函数:sklearn.manifold.locally_linear_embedding()

LLE原理: manifold.LocallyLinearEmbedding(LLE)流形学习之局部线性嵌入算法详解

一般来说,需要调参的参数只有样本近邻的个数。

参数详解:

  1. n_neighbors:即我们搜索样本的近邻的个数,默认是5。 n_neighbors个数越大,则建立样本局部关系的时间会越大,也就意味着算法的复杂度会增加。当然n_neighbors个数越大,则降维后样本的局部关系会保持的更好。在下一节我们可以通过具体的例子看出这一点。一般来说,如果算法运行时间可以接受,我们可以尽量选择一个比较大一些的n_neighbors。
  2. n_components:即我们降维到的维数。如果我们降维的目的是可视化,则一般可以选择2-5维。
  3. reg正则化系数,在n_neighbors大于n_components时,即近邻数大于降维的维数时,由于我们的样本权重矩阵不是满秩的,LLE通过正则化来解决这个问题。默认是0.001。一般不用管这个参数。当近邻数远远的大于降维到的维数时可以考虑适当增大这个参数。
  4. eigen_solver特征分解的方法。有‘arpack’和‘dense’两者算法选择。当然也可以选择’auto’让scikit-learn自己选择一个合适的算法。‘arpack’和‘dense’的主要区别是‘dense’一般适合于非稀疏的矩阵分解。而‘arpack’虽然可以适应稀疏和非稀疏的矩阵分解,但在稀疏矩阵分解时会有更好算法速度。当然由于它使用一些随机思想,所以它的解可能不稳定,一般需要多选几组随机种子来尝试。
  5. method: 即LLE的具体算法。LocallyLinearEmbedding支持4种LLE算法,分别是’standard’对应我们标准的LLE算法,'hessian’对应HLLE算法,‘modified’对应MLLE算法,‘ltsa’对应LTSA算法。默认是’standard’。一般来说HLLE/MLLE/LTSA算法在同样的近邻数 n n e i g h b o r s n_{neighbors} nneighbors情况下,运行时间会比标准的LLE长,当然降维的效果会稍微好一些。如果你对降维后的数据局部效果很在意,那么可以考虑使用HLLE/MLLE/LTSA或者增大 n n e i g h b o r s n_{neighbors} nneighbors,否则标准的LLE就可以了。需要注意的是使用MLLE要求 n n e i g h b o r s > n c o m p o n e n t s n_{neighbors} > n_{components} nneighbors>ncomponents,而使用HLLE要求 n n e i g h b o r s > n c o m p o n e n t s ∗ ( n c o m p o n e n t s + 3 ) / 2 n_{neighbors} > n_{components} * (n_{components} + 3) / 2 nneighbors>ncomponents(ncomponents+3)/2
  6. neighbors_algorithm:这个是k近邻的搜索方法,和KNN算法的使用的搜索方法一样。算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。这三种方法在K近邻法(KNN)原理小结中都有讲述,如果不熟悉可以去复习下。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘ k d t r e e kd_tree kdtree’对应第二种KD树实现,‘ b a l l t r e e ball_tree balltree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,如果样本少特征也少,使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间会很长,效率不高,建议选择KD树实现‘ k d t r e e kd_tree kdtree’,此时如果发现‘ k d t r e e kd_tree kdtree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ b a l l t r e e ball_tree balltree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。

属性详解:

  1. embedding_vectors_:给出了原始数据在低维空间的嵌入矩阵。
  2. reconstruction_error_:给出了重构误差。

方法详解:

  1. fit(X[, y]):训练模型。
  2. transform(X):执行降维,返回降维后的样本集。
  3. fit_transform(X[, y]):训练模型并执行降维,返回降维后的样本集。
  • Reference

  1. 2.2. Manifold learning
  2. “Nonlinear dimensionality reduction by locally linear embedding” Roweis, S. & Saul, L. Science 290:2323 (2000)
  3. 2.2. 流形学习
  4. manifold.LocallyLinearEmbedding(LLE)流形学习之局部线性嵌入算法详解
  5. 用scikit-learn研究局部线性嵌入(LLE)
  6. 华校专-降维

你可能感兴趣的:(小白学机器学习)