Jaccard 相似系数(Jaccard Similarity Coefficient)是用于衡量两个集合相似度的统计量。它定义为两个集合的交集大小除以它们并集的大小。Jaccard 距离则是 1 减去 Jaccard 相似系数。
公式如下:
[ J(A, B) = \frac{|A \cap B|}{|A \cup B|} ]
其中:
- ( A ) 和 ( B ) 是两个集合。
- ( |A \cap B| ) 是两个集合的交集大小。
- ( |A \cup B| ) 是两个集合的并集大小。
示例代码
下面是一些不同编程语言中计算 Jaccard 相似系数的示例。
Rust 实现
use std::collections::HashSet;
fn jaccard_similarity<T: std::hash::Hash + std::cmp::Eq>(set1: &HashSet<T>, set2: &HashSet<T>) -> f64 {
let intersection: HashSet<_> = set1.intersection(set2).collect();
let union: HashSet<_> = set1.union(set2).collect();
intersection.len() as f64 / union.len() as f64
}
fn main() {
let set1: HashSet<_> = vec![1, 2, 3].into_iter().collect();
let set2: HashSet<_> = vec![2, 3, 4].into_iter().collect();
let similarity = jaccard_similarity(&set1, &set2);
println!("Jaccard similarity: {}", similarity);
}
C++ 实现
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
double jaccard_similarity(const std::set<int>& set1, const std::set<int>& set2) {
std::set<int> intersection;
std::set<int> union_set;
std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(),
std::inserter(intersection, intersection.begin()));
std::set_union(set1.begin(), set1.end(), set2.begin(), set2.end(),
std::inserter(union_set, union_set.begin()));
return static_cast<double>(intersection.size()) / union_set.size();
}
int main() {
std::set<int> set1 = {1, 2, 3};
std::set<int> set2 = {2, 3, 4};
double similarity = jaccard_similarity(set1, set2);
std::cout << "Jaccard similarity: " << similarity << std::endl;
}
Python 实现
def jaccard_similarity(set1, set2):
intersection = set1.intersection(set2)
union = set1.union(set2)
return len(intersection) / len(union)
if __name__ == "__main__":
set1 = {1, 2, 3}
set2 = {2, 3, 4}
similarity = jaccard_similarity(set1, set2)
print(f"Jaccard similarity: {similarity}")
JavaScript 实现
function jaccardSimilarity(set1, set2) {
const intersection = new Set([...set1].filter(x => set2.has(x)));
const union = new Set([...set1, ...set2]);
return intersection.size / union.size;
}
const set1 = new Set([1, 2, 3]);
const set2 = new Set([2, 3, 4]);
const similarity = jaccardSimilarity(set1, set2);
console.log(`Jaccard similarity: ${similarity}`);
解释
- 交集和并集:所有实现都计算两个集合的交集和并集。
- 相似度计算:Jaccard 相似系数通过交集的大小除以并集的大小来计算。
这些实现展示了如何在不同编程语言中计算 Jaccard 相似系数,适用于各种应用场景,例如比较两个文本的相似度、图像处理中的相似性度量等。