正确实施Johnson-Lindenstrauss引理

时间:2013-08-12 18:08:01

标签: algorithm matlab computation

我正在尝试实施Johnson-Lindenstrauss lemma。我在这里搜索了伪代码,但无法获得任何伪代码。

我不知道我是否正确实施了它。我只是想让你了解这个引理的人请为我检查我的代码并告诉我正确的matlab实现。

n = 2;
d = 4;
k = 2;
G = rand(n,d);
epsilon = sqrt(log(n)/k);

% Projection in dim k << d 
% Defining P (k x d) 
P = randn(k,d); 

% Projecting down to k-dim
proj = P.*G;
u = proj(:,1); 
v = proj(:,2); 
% u = P * G(:,5); 
% v = P * G(:,36); 
norm(G(:,1)-G(:,2))^2 * k * (1-epsilon); 
norm(u - v)^2; 
norm(G(:,1)-G(:,2))^2 * k * (1+epsilon);

3 个答案:

答案 0 :(得分:0)

找到你需要求解多项式方程的epsilon的第一部分。

n = 2;
k = 2;
pol1 = [-1/3 1/2 0 4*log2(n)/k];
c = roots(pol1)

    1.4654 + 1.4304i
    1.4654 - 1.4304i
   -1.4308 + 0.0000i

然后你需要删除复杂的根并保持真正的根:

epsilon = c(imag(c)==0);

% if there are more than one root with imaginary part equal to 0 then you need to select the smaller one.

现在您知道epsilon应该等于或大于结果。

答案 1 :(得分:0)

对于R ^ N中的任何m个点集合以及对于k = 20 * logm / epsilon ^ 2和epsilon <2。 1/2:

1 / SQRT(K)。* randn(K,N)

获得Pr [成功]> = 1-2m ^(5 *ε-3)

答案 2 :(得分:0)

使用Johnson Lindenstrauss Lemma RandPro可以使用R包进行随机投影