【问题标题】:Correct implementation of The Johnson-Lindenstrauss lemma约翰逊-林登斯特劳斯引理的正确实现
【发布时间】:2013-08-14 03:53:30
【问题描述】:

我正在尝试实现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);

【问题讨论】:

  • 您要编写哪个引理。代码的输入和输出是什么。我检查了你提到的页面,但有很多引理和事实。
  • 第一个引理。包含这个的引理: (1-\epsilon)\|uv\|^2\le\|f(u)-f(v)\|^2\le(1+\epsilon)\|uv\|^ 2.

标签: algorithm matlab computation


【解决方案1】:

首先要找到求解多项式方程所需的 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 应该等于或大于结果。

【讨论】:

  • 为什么这个 epsilon = sqrt(log(n)/k);不正确?我怎么知道我对引理的实现是否正确?我要做的就是查看我的引理的实现是否正确正在查看 norm(u - v)^2;如果值介于 norm(G(:,1)-G(:,2))^2 * k * (1-epsilon) 之间;和 norm(G(:,1)-G(:,2))^2 * k * (1+epsilon);包容,那么我的结论是对的?我不知道这是否是一种了解引理的实施是否正确的方法。有没有人可以正确知道实施是否正确?
【解决方案2】:

对于 R^N 中的任意 m 个点的集合,对于 k = 20*logm/epsilon^2 和 epsilon

1/sqrt(k).*randn(k,N)

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

【讨论】:

    【解决方案3】:

    一个 R 包可用于使用 Johnson Lindenstrauss Lemma RandPro 执行随机投影

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 2014-07-06
      • 2019-06-20
      • 2021-04-01
      相关资源
      最近更新 更多