我正在尝试在非常稀疏的数据集上应用随机投影方法。我找到了关于Johnson Lindenstrauss方法的论文和教程,但是每一个方法都充满了方程式,对我没有任何有意义的解释。例如,此文档位于Johnson-Lindenstrauss
不幸的是,从这个文档中,我不知道算法的实现步骤。这是一个很长的镜头,但有谁能告诉我简单的英文版本或非常简单的算法伪代码?或者我在哪里可以开始挖掘这个方程式?有什么建议?
例如,我通过阅读this paper concerning Johnson-Lindenstrauss从算法中理解的是:
AxB
矩阵,其中A
是样本数,B
是维度数,例如100x5000
。我希望将其维度缩减为500
,这将产生100x500
矩阵。据我了解:首先,我需要构建一个100x500
矩阵并随机填入+1
和-1
(概率为50%)。
修改
好吧,我想我开始明白了。所以我们有一个A
矩阵mxn
。我们希望将其缩减为E
mxk
。
我们需要做的是,构建一个具有R
维度的矩阵nxk
,并将其填充为0
,-1
或+1
,关于2/3
,1/6
和1/6
概率。
构建此R
后,我们只需执行矩阵乘法AxR
即可找到缩减矩阵E
。但是我们不需要进行完整的矩阵乘法,因为如果Ri
的元素是0
,我们不需要进行计算。简单地跳过它。但是,如果我们面对1
,我们只需添加列,或者如果它是-1
,只需将其从计算中减去即可。因此,我们只需使用求和而不是乘法来查找E
。这就是使这种方法非常快的原因。
事实证明这是一个非常简洁的算法,虽然我觉得这个想法太愚蠢了。
答案 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