需要算法帮助

时间:2011-07-19 21:15:28

标签: algorithm

我有一组序列(例如10000个序列),并产生表示每两个序列之间成对相似性的矩阵(10000×10000)。

现在的目标是从大集合中检索一个子集(例如1000个序列),并确保该子集中每两个序列之间的成对相似性在一个范围内(例如50%~85%)。

有没有快速算法呢?

4 个答案:

答案 0 :(得分:2)

您可以将其转换为图论问题:

  1. 每个序列都是一个节点
  2. 如果两个节点的相似性在给定范围内,则它们之间存在边缘
  3. 您的目标是找到大号connected component(如果您的相似关系是传递性的......)或大号clique(如果没有的话)。

答案 1 :(得分:0)

您可以生成成对相似性的排序列表(返回矩阵),获取该排序列表的子集,然后确保该子列表与您的子集之间的交集与您的子集大小相同,从而验证您子集中的所有元素都在指定的范围内。

需要大量设置来生成矩阵和大量空间来创建有序列表。至少,您的矩阵设置为O(n ^ 2)。

答案 2 :(得分:0)

这对我来说听起来像是“派系”;集团决策问题是NP完全的。

根据序列相似性背后的统计数据,您可能会对max clique问题的近似算法感到满意。随机算法甚至可能对您来说足够好。但总的来说这是一个非常棘手的问题,即使N = 100,你也不太可能做得多。

答案 3 :(得分:0)

许多相似性与n维空间中的点积相当或相关,即使未明确计算相似性也是如此。在这些情况下,以及可能的其他情况下,a.b和b.c的高值可能意味着a.c的值很高,但这种情况的界限并不是很好 - 不像我原先认为的那样好。

只涉及三个向量 - a,b和c我认为你可以绘制一个三维图而不管底层空间的维数,我认为最坏的情况是所有三个向量都在一个平面内,b以上b和c。在那种情况下,例如对于所有单位向量和a.b = b.c = 0.9,a比b高约25度,c低于它约25度,并且a.c = 0.62。事实上,对于a.c = b.c = x,在这种情况下,a.c = 2x ^ 2 - 1。

在这些情况下,如果我绝对必须解决这个特定问题,我会尝试回溯搜索以枚举非常接近特定节点的节点集。例如,您可以从两个最相似的节点开始,然后运行搜索,在每个级别添加尚未尝试的最接近原始种子节点之一的节点。或者,您可以构建单个链接群集并检查所需的所有子树。