A
和B
是一组N
维向量(N=10
),|B|>=|A|
(|A|=10^2
,|B|=10^5
) 。相似性度量sim(a,b)是点积(必需)。任务如下:a
A
中的每个向量b
在B
中查找向量ss
,使得所有对的相似度[a_1,b_1]
之和最大。< / p>
我的第一次尝试是贪心算法:
但在这种情况下,这种贪心算法不是最理想的:
a_1=[1, 0] a_2=[.5, .4] b_1=[1, 1] b_2=[.9, 0] sim(a_1,b_1)=1 sim(a_1,b_2)=.9 sim(a_2,b_1)=.9 sim(a_2, b_2)=.45
算法返回[a_2, b_2]
和ss=1.45
,ss=1.8
,但最佳解决方案会产生{{1}}。
有没有有效的算法来解决这个问题?感谢
答案 0 :(得分:1)
这实际上是加权matching problem中的bipartite graph。假设权重函数f
是点积(|ab|
)
我不认为你的权重函数的特殊结构会大大简化问题,所以你很难找到最大匹配。
您可以找到针对此问题in this wikipedia article的一些基本算法。虽然乍一看它们似乎不适用于您的数据(V = 10^5
,E = 10^7
),但我仍会研究它们:其中一些可能会让您利用“跛脚”的一组顶点,其中一个数量级比另一个数量级小。
This article似乎也很相关,但没有列出任何算法。
不完全是一个解决方案,但希望它有所帮助。
答案 1 :(得分:0)
我在这里第二个尼基塔,这是一个任务(或匹配)问题。我不确定这对您的问题在计算上是否可行,但您可以使用匈牙利语算法,也称为Munkres' assignment algorithm,其中分配(i,j)
的成本是{{1}的点积的负数。 1}}和ai
。除非您碰巧知道A和B的元素是如何形成的,否则我认为这是针对您的问题最有效的已知算法。