我正在使用一个邻接矩阵来总结一个二元图,这样行就是图中的一个组,列是第二组。如果行和列之间有边,则值为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的任意值的这个问题,但缺乏算法训练来从头脑中知道它。有什么想法或参考?
谢谢!
答案 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)
计算这笔金额要容易得多,因为你可以这样做:
你可以使用choose函数的定义(在时间O(n + k))计算n相当有效地选择k。如果您有R行和C列,则总工时为:
这给出了总运行时间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!)