随机投影算法伪码

时间:2011-09-19 16:55:04

标签: algorithm machine-learning multidimensional-array

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

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

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

  1. 假设我们有一个AxB矩阵,其中A是样本数,B是维度数,例如100x5000。我希望将其维度缩减为500,这将产生100x500矩阵。
  2. 据我了解:首先,我需要构建一个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。这就是使这种方法非常快的原因。

    事实证明这是一个非常简洁的算法,虽然我觉得这个想法太愚蠢了。

4 个答案:

答案 0 :(得分:2)

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

这不是一个投影,但它几乎是一个投影; R的行不是正交的,但在更高维度的空间内,它们几乎是。事实上,你选择的那两个矢量的点积将非常接近0.这就是为什么它实际上是一个很好的近似实际找到适当的投影基础。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

选项A:

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

步骤2.对“加密数据”应用稀疏投影(稀疏随机投影仅对密集数据有用)

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

选项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 :(得分:0)

使用Johnson-Lindenstrauss引理执行随机投影的R包 sample krb5.conf file on the MIT web site