我一直在编写一个应用程序,它需要选择与给定向量最匹配的矩阵的行向量(让我们称之为查询向量)。鉴于矩阵行和查询向量都被归一化为单位向量,对我来说很明显,简单的矩阵向量乘法将产生余弦相似性的向量,其中最大值是最佳匹配I&#39 ;我正在寻找。
现在的问题是,这个行选择正在迭代中运行,我在其中选择最佳行,使用它来重新计算查询向量,然后,在下一次迭代开始之前,我需要删除该行,因此它不会#39; t再次被选中(即使查询向量重新计算,这很可能会发生)。
我在MATLAB中实现了这个算法,并且MATLAB具有所有时髦的语法,它非常简单。但我需要在CUDA中以同样的速度做同样的事情。问题很简单:
如何"禁用"矩阵的行向量,以便在下一次迭代中无法选取它?
我找到了几个解决方案:
前两个是性能打击,第三个是好的,但问题是点积的范围从-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或更小的东西吗?
谢谢大家的时间。