在二分图中量化成对,三等等重叠

时间:2012-02-27 21:56:26

标签: algorithm graph overlap graph-algorithm

我正在使用一个邻接矩阵来总结一个二元图,这样行就是图中的一个组,列是第二组。如果行和列之间有边,则值为1,如果不是,则为0.所以,我的矩阵看下面

  X Y Z
A 0 1 0
B 0 0 1
C 1 1 1

我想量化1 ... S个选定行的行重叠分布。因此,例如,在上面的矩阵中,平均成对重叠将是(0 + 1/3 + 1/3)/ 3 = 2/9,三向重叠(必须有一个更好的词)是0。

我正在寻找一种有效的算法来为N行和M列执行此操作。到目前为止,我所提出的任何内容通常都无法完成所有可能的行组合。

我可以做一些事情,比如查看每列的重叠概率 - 所以,类似于每列长度为S的可能组合的数量,其中包括至少1项除以行组合的总数。但我还没有找到一种方法来使用这些信息来得出正确的答案。

我一直在想必须有某种扫描算法或其他方法来解决S的任意值的这个问题,但缺乏算法训练来从头脑中知道它。有什么想法或参考?

谢谢!

2 个答案:

答案 0 :(得分:3)

我认为你可以通过建立一个直方图来相当有效地计算这一点,该直方图可以跟踪每列中有多少1个。举个例子:

  X Y Z
A 0 1 0
B 0 0 1
C 1 1 1

如果对列进行求和,则分别得到1,2和2。要找到平均成对相似性,您可以考虑找到每列的平均相似度,然后取平均值。在这种情况下,为了找到成对相似性,您可以为每列询问有多少对元素。对于列X,这是0.对于列Y,这是1,对于列Z,这也是1。如果我们计算(0/3 + 1/3 + 1/3)/ 3,则根据需要得到2/9。要找到三向相似性,您可以询问每列中有多少三元组。每个都有0,所以平均值为0.

这有效的原因是你想要的总和是

  

(Sum(所有可能的k元组)(#列与行/ num列匹配))/ num k-tuples

你可以将其考虑在内以获得

  

(Sum(所有可能的行k元组)(#列跨行匹配))/(num k-tuples * num columns)

然后可以互换第一笔总和以获得

  

(Sum(所有列)(与此列匹配的行的#k-tuples))/(num k-tuples * num columns)

计算这笔金额要容易得多,因为你可以这样做:

  1. 计算列总和。
  2. 对于每一列,找出从中挑选k个元素的方式(这等于n选择k),然后除以列数。
  3. 将此总数除以有k个元素的行数(这是选择k的行数)。
  4. 你可以使用choose函数的定义(在时间O(n + k))计算n相当有效地选择k。如果您有R行和C列,则总工时为:

    1. 对每行的列求和:O(RC)
    2. 对于列,计算k元素组合的数量:O(R + k),因为总和最多为R。
    3. 在所有列中,计算此总数:O(CR + Ck)
    4. 将它们平均在一起:O(C)
    5. 这给出了总运行时间O(CR + Ck)。如果你用行数绑定k,那么我认为它在时间O(CR)中运行。

      希望这有帮助!

答案 1 :(得分:1)

设n为行数,m为列数。组合总数= m *行组合= m*n*(n-1)/2

设si是第i列的总和。匹配总数= si*(si-1)/2

所以解决方案是:( s1*(s1-1)/2 + s2*(s2-1)/2 +...+sm*(sm-1)/2 ) / (m*n*(n-1)/2)

例如,在您的情况下,分母= 3 * 3 * 2/2 = 9

s1 = 0, s2=2, s3=2

分子是:(0 + 1 + 1)= 2

答案= 2/9

对于一般的p-way交叉点,请更改公式。

( choose(s1,p), choose(s2,p)+...+choose(sm,p) ) / (m*choose(n,p))

其中choose(k,p) = k!/((k-p)!p!)