距离--jaccard系数

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}`);

解释

  1. 交集和并集:所有实现都计算两个集合的交集和并集。
  2. 相似度计算:Jaccard 相似系数通过交集的大小除以并集的大小来计算。

这些实现展示了如何在不同编程语言中计算 Jaccard 相似系数,适用于各种应用场景,例如比较两个文本的相似度、图像处理中的相似性度量等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值