johnson_lindenstrauss_min_dim#

sklearn.random_projection.johnson_lindenstrauss_min_dim(n_samples, *, eps=0.1)[源码]#

查找一个“安全”的随机投影分量数。

随机投影 p 引入的失真只会以一定的概率改变欧几里得空间中两点之间的距离,改变因子为 (1 +- eps)。投影 p 是一个 eps-embedding,定义如下:

(1 - eps) ||u - v||^2 < ||p(u) - p(v)||^2 < (1 + eps) ||u - v||^2

其中 u 和 v 是来自形状为 (n_samples, n_features) 的数据集的任意行,eps 在 ]0, 1[ 范围内,p 是形状为 (n_components, n_features) 的随机高斯 N(0, 1) 矩阵(或稀疏 Achlioptas 矩阵)的投影。

保证 eps-embedding 的最小分量数为:

n_components >= 4 log(n_samples) / (eps^2 / 2 - eps^3 / 3)

请注意,维度数与原始特征数无关,而是取决于数据集的大小:数据集越大,eps-embedding 的最小维度就越高。

用户指南 中阅读更多内容。

参数:
n_samplesint or array-like of int

样本数量,应为大于 0 的整数。如果给出数组,则将逐元素计算安全分量数。

epsfloat or array-like of shape (n_components,), dtype=float, default=0.1

Johnson-Lindenstrauss 引理定义的范围内 (0, 1) 的最大失真率。如果给出数组,则将逐元素计算安全分量数。

返回:
n_componentsint or ndarray of int

以良好概率保证具有 n_samples 的 eps-embedding 的最小分量数。

References

示例

>>> from sklearn.random_projection import johnson_lindenstrauss_min_dim
>>> johnson_lindenstrauss_min_dim(1e6, eps=0.5)
np.int64(663)
>>> johnson_lindenstrauss_min_dim(1e6, eps=[0.5, 0.1, 0.01])
array([    663,   11841, 1112658])
>>> johnson_lindenstrauss_min_dim([1e4, 1e5, 1e6], eps=0.1)
array([ 7894,  9868, 11841])