具有任意向量的预定值的点积

时间:2014-05-28 20:15:38

标签: matrix vector product

我一直在编写一个应用程序,它需要选择与给定向量最匹配的矩阵的行向量(让我们称之为查询向量)。鉴于矩阵行和查询向量都被归一化为单位向量,对我来说很明显,简单的矩阵向量乘法将产生余弦相似性的向量,其中最大值是最佳匹配I&#39 ;我正在寻找。

现在的问题是,这个行选择正在迭代中运行,我在其中选择最佳行,使用它来重新计算查询向量,然后,在下一次迭代开始之前,我需要删除该行,因此它不会#39; t再次被选中(即使查询向量重新计算,这很可能会发生)。

我在MATLAB中实现了这个算法,并且MATLAB具有所有时髦的语法,它非常简单。但我需要在CUDA中以同样的速度做同样的事情。问题很简单:

如何"禁用"矩阵的行向量,以便在下一次迭代中无法选取它?

我找到了几个解决方案:

  • 将剩余的行复制到临时矩阵中并迭代
  • 在每次迭代中,使用新计算的查询向量的反向值填充所有行以禁用(在MATLAB表示法中,-1。/ queryVector)
  • 只需用零填充行

前两个是性能打击,第三个是好的,但问题是点积的范围从-1到1(所有向量都可以有负值),而不是0到1,留下空间错误的空行选择。

鉴于我不是数学专家,最终的问题如下:

是否有一个矢量给出带有任意向量的-1或更少的点积?

我的感觉告诉我,对于这个有一个很好的和优雅的解决方案,无论是数学还是算法,但我似乎无法弄明白。显然,如果你发现我上面说的任何问题,请告诉我。

修改

我不想分享代码,因为我在MATLAB和CUDA中实现这一点并略有不同,所以我想避免可能的混淆。但在这里。这几乎是MATLAB中以循环方式运行的整个算法:

    1. alphas = trainingMatrixCopy * residual;            
    2. [~, j] = max(alphas);            
    3. indices(n) = j;
    4. trainingSubMatrix(n, :) = trainingMatrixCopy(j, :);
    5. trainingMatrixCopy(j, :) = 0;
    6. subS = pinv(trainingSubMatrix(1:n, :))' * testingVector';
    7. s(indices(1:n)) = subS;        
    8. residual = testingVector' - trainingSubMatrix(1:n, :)' * subS;

trainingMatrixCopy 残差都被归一化, alphas 提供上面提到的余弦度量。在最后一行重新计算之后,我想确保永远不会再次挑选 trainingMatrixCopy 的* j *行。第5行几乎确保了,但并不完全。我很好奇:*第j行可以替换为在第1行乘以残差时会产生-1或更小的东西吗?

谢谢大家的时间。

0 个答案:

没有答案