4.6. 随机投影(Random Projection)

sklearn.random_projection 模块实现了一种简单、计算效率高的方法来降低数据的维数。 该方法通过交易 准确率的可控量 来换取 更快的处理时间和更小的模型规模。 这个模块实现了两种类型的无结构化的随机矩阵(unstructured random matrix): Gaussian random matrixsparse random matrix.

控制随机投影矩阵的维数和分布,以保持数据集中任意两个样本之间的配对距离。因此,随机投影是一种适合于基于距离的近似方法。

参考文献:

4.6.1. Johnson-Lindenstrauss 引理

随机投影效率背后的主要理论结果 是 Johnson-Lindenstrauss lemma (引用自维基百科):

在数学上, Johnson-Lindenstrauss 引理是一个关于点从高维到低维欧氏空间的低失真嵌入(low-distortion embeddings)的结果。 引理指出,高维空间中的一小部分点可以嵌入到较低维的空间中,这样就几乎保持了点之间的距离。 用于嵌入的映射至少是Lipschitz的,甚至可以看作是正交投影(orthogonal projection)。

仅仅只知道样本的数量, 函数 sklearn.random_projection.johnson_lindenstrauss_min_dim 保守估计随机子空间的最小 size 以便保证随机投影引入的是一个有界的失真(bounded distortion)。

>>> from sklearn.random_projection import johnson_lindenstrauss_min_dim
>>> johnson_lindenstrauss_min_dim(n_samples=1e6, eps=0.5)
663
>>> johnson_lindenstrauss_min_dim(n_samples=1e6, eps=[0.5, 0.1, 0.01])
array([    663,   11841, 1112658])
>>> johnson_lindenstrauss_min_dim(n_samples=[1e4, 1e5, 1e6], eps=0.1)
array([ 7894,  9868, 11841])
../images/sphx_glr_plot_johnson_lindenstrauss_bound_0011.png
../images/sphx_glr_plot_johnson_lindenstrauss_bound_0021.png

案例:

参考文献:

4.6.2. 高斯随机投影

sklearn.random_projection.GaussianRandomProjection 类 通过把原始输入空间投影(projecting)到 一个随机产生的矩阵(矩阵的components是从 \(N(0, \frac{1}{n_{components}})\) 分布中抽取的)进行维数约减。

下面的小例子展示了如何使用高斯随机投影

>>> import numpy as np
>>> from sklearn import random_projection
>>> X = np.random.rand(100, 10000)
>>> transformer = random_projection.GaussianRandomProjection()
>>> X_new = transformer.fit_transform(X)
>>> X_new.shape
(100, 3947)

4.6.3. 稀疏随机投影

sklearn.random_projection.SparseRandomProjection 类 通过把原始输入空间投影(projecting)到 一个稀疏随机矩阵进行维数约减。

稀疏随机矩阵是稠密高斯随机投影矩阵的一个替代方案,它既保证了相似的嵌入质量同时有很高的存储效率和更快速的投影数据的计算。

如果我们定义 s = 1 / density, 那么随机矩阵的元素可以从下面的分布中抽取:

\[\begin{split}\left\{ \begin{array}{c c l} -\sqrt{\frac{s}{n_{\text{components}}}} & & 1 / 2s\\ 0 &\text{with probability} & 1 - 1 / s \\ +\sqrt{\frac{s}{n_{\text{components}}}} & & 1 / 2s\\ \end{array} \right.\end{split}\]

其中 \(n_{\text{components}}\) 是投影子空间的size。默认情况下,Ping Li 等人推荐把非零元素的密度被设置为最小密度: \(1 / \sqrt{n_{\text{features}}}\)

下面的小例子展示了如何使用 稀疏随机投影变换器:

>>> import numpy as np
>>> from sklearn import random_projection
>>> X = np.random.rand(100, 10000)
>>> transformer = random_projection.SparseRandomProjection()
>>> X_new = transformer.fit_transform(X)
>>> X_new.shape
(100, 3947)

参考文献: