【发布时间】:2012-08-24 14:25:17
【问题描述】:
我在计算集合(位向量)的 Jaccard 相似度时遇到了这个问题:
v1 = 10111
v2 = 10011
交叉点大小 = 3; (我们怎样才能找到它?)
联合大小 = 4,(我们怎样才能找到它?)
Jaccard 相似度 = (交集/并集) = 3/4
但我不明白我们如何找出两个向量的“交集”和“并集”。
请帮帮我。
【问题讨论】:
标签: c# vector similarity
我在计算集合(位向量)的 Jaccard 相似度时遇到了这个问题:
v1 = 10111
v2 = 10011
交叉点大小 = 3; (我们怎样才能找到它?)
联合大小 = 4,(我们怎样才能找到它?)
Jaccard 相似度 = (交集/并集) = 3/4
但我不明白我们如何找出两个向量的“交集”和“并集”。
请帮帮我。
【问题讨论】:
标签: c# vector similarity
大概你对“交集”和“联合”的定义是“在两个值中设置的位数”和“在任何一个值中设置的位数”......这是(假设你使用类似@987654324 @ 或 long 用于向量):
int intersection = CountBits(v1 & v2);
int union = CountBits(v1 | v2);
接下来你只需要实现CountBits。 This Stack Overflow question 可以帮到你。
您可能想要使用BitArray,而不是使用int 或long。这有And 和Or 方法,它们看起来 好像它们不会改变原始值,但它并不完全清楚。当然,您需要找出计算在 BitArray 中设置的位数的最佳方法 - 只需 array.Cast<bool>().Count(bit => bit) 就可以了。
【讨论】: