我在计算集合(位向量)的 Jaccard 相似度时遇到了这个问题:
v1 = 10111
v2 = 10011
交叉点的大小 = 3;(我们怎么能找到它?)
union 的大小 = 4,(我们怎样才能找到它?)
Jaccard 相似度 = (交集/并集) = 3/4
但我不明白我们如何找出两个向量的“交集”和“并集”。
请帮我。
我在计算集合(位向量)的 Jaccard 相似度时遇到了这个问题:
v1 = 10111
v2 = 10011
交叉点的大小 = 3;(我们怎么能找到它?)
union 的大小 = 4,(我们怎样才能找到它?)
Jaccard 相似度 = (交集/并集) = 3/4
但我不明白我们如何找出两个向量的“交集”和“并集”。
请帮我。
大概您对“交集”和“并集”的定义是“在两个值中设置的位数”和“在任一值中设置的位数”......这是(假设您使用类似int
or的东西long
作为向量) :
int intersection = CountBits(v1 & v2);
int union = CountBits(v1 | v2);
接下来你只需要实现CountBits
. 这个 Stack Overflow 问题可以帮助你。
您可能想要使用 ,而不是使用int
or 。那有和方法,看起来它们不会改变原始值,但并不完全清楚。当然,您需要找出计算 a中设置的位的最佳方法 -可能会很好。long
BitArray
And
Or
BitArray
array.Cast<bool>().Count(bit => bit)