【问题标题】:Random projection algorithm pseudo code随机投影算法伪代码
【发布时间】:2011-11-20 10:19:59
【问题描述】:

我正在尝试在非常稀疏的数据集上应用随机投影方法。我找到了有关 Johnson Lindenstrauss 方法的论文和教程,但每一篇都充满了方程式,对我来说没有任何意义的解释。比如这个文档在Johnson-Lindenstrauss

不幸的是,从这个文档中,我无法了解算法的实现步骤。这是一个很长的镜头,但有没有人可以告诉我简单的英文版本或算法的非常简单的伪代码?或者我可以从哪里开始挖掘这个方程?有什么建议?

例如,我通过阅读this paper concerning Johnson-Lindenstrauss从算法中了解到的是:

  1. 假设我们有一个AxB 矩阵,其中A 是样本数,B 是维度数,例如100x5000。我想将它的维度减少到500,这将产生一个100x500矩阵。

据我了解:首先,我需要构造一个100x500 矩阵并用+1-1 随机填充条目(概率为50%)。

编辑:
好吧,我想我开始明白了。所以我们有一个矩阵A,它是mxn。我们想将它减少到E,即mxk

我们需要做的是,构造一个矩阵R,其维度为nxk,并用0-1+1填充,相对于2/31/61/6 概率。

在构造了这个R 之后,我们将简单地进行矩阵乘法AxR 来找到我们的简化矩阵E。但是我们不需要做全矩阵乘法,因为如果Ri的元素是0,我们就不需要做计算了。简单地跳过它。但是如果我们面对1,我们只需添加列,或者如果它是-1,只需从计算中减去它。所以我们将简单地使用求和而不是乘法来找到E。这就是使这种方法非常快速的原因。

结果是一个非常简洁的算法,虽然我觉得太愚蠢了,无法理解。

【问题讨论】:

标签: algorithm machine-learning multidimensional-array


【解决方案1】:

使用 Johnson-Lindenstrauss 引理执行随机投影的 R 包 RandPro

【讨论】:

    【解决方案2】:

    如果您的数据集是稀疏的,那么稀疏随机投影将无法正常工作。 你有几个选择:

    选项 A:

    步骤 1. 应用结构化密集随机投影(通常使用所谓的快速哈达玛变换)。这是一个特殊的投影,计算速度非常快,但在其他方面具有正常密集随机投影的属性

    第 2 步。对“致密数据”应用稀疏投影(稀疏随机投影仅对密集数据有用)

    选项 B: 对稀疏数据应用 SVD。如果数据稀疏但有一些结构 SVD 更好。随机投影保留所有点之间的距离。 SVD 更好地保留了密集区域之间的距离——实际上这更有意义。人们还使用随机投影来计算大型数据集的 SVD。 Random Projections 为您提供效率,但不一定是在低维度中嵌入的最佳质量。 如果您的数据没有结构,则使用随机投影。

    选项 C:

    对于 SVD 误差较小的数据点,使用 SVD;其余点使用随机投影

    选项 D: 使用基于数据点本身的随机投影。 这很容易理解发生了什么。它看起来像这样:

    create a n by k matrix (n number of data point, k new dimension)
    for i from 0 to k do #generate k random projection vectors  
       randomized_combination = feature vector of zeros (number of zeros = number of features) 
       sample_point_ids = select a sample of point ids
       for each point_id in sample_point_ids do:
           random_sign = +1/-1 with prob. 1/2
           randomized_combination += random_sign*feature_vector[point_id] #this is a vector operation
        normalize the randomized combination
        #note that the normal random projection is:
        # randomized_combination = [+/-1, +/-1, ...] (k +/-1; if you want sparse randomly set a fraction to 0; also good to normalize by length]
        to project the data points on this random feature just do
        for each data point_id in dataset:
            scores[point_id, j] = dot_product(feature_vector[point_id], randomized_feature)
    

    如果你还在寻找解决这个问题的方法,请在此留言,我可以给你更多的伪代码。

    考虑它的方式是随机投影只是一个随机模式,数据点和模式之间的点积(即投影数据点)为您提供了它们之间的重叠。因此,如果两个数据点与许多随机模式重叠,则这些点是相似的。因此,随机投影在使用较少空间的同时保持相似性,但它们也会在成对相似性中添加随机波动。 JLT 告诉你的是波动 0.1 (eps) 你需要大约 100*log(n) 个维度。

    祝你好运!

    【讨论】:

      【解决方案3】:

      你的想法是对的。但是,据我了解随机项目,矩阵 R 的行应该有单位长度。我相信这大约是 1/sqrt(k) 归一化的目的,以归一化它们不是单位向量的事实。

      这不是一个投影,但是,它几乎是一个投影; R 的行不是正交的,但在更高维度的空间中,它们几乎是正交的。事实上,您选择的任何两个向量的点积都将非常接近 0。这就是为什么它通常是实际找到适当投影基础的良好近似值。

      【讨论】:

      【解决方案4】:

      从高维数据 A 到低维数据 E 的映射在后一篇论文的定理 1.1 的陈述中给出——它只是一个标量乘法,然后是一个矩阵乘法。数据向量是矩阵 A 和 E 的行。正如作者在 7.1 节中指出的那样,您不需要使用完整的矩阵乘法算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-07
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-11
        相关资源
        最近更新 更多