Java实现余弦相似度算法

余弦相似度(Cosine Similarity)是一种衡量两个向量之间相似度的方法,它通过计算两个向量的夹角的余弦值来得到相似度。在推荐系统、文本相似度检测等领域中,余弦相似度算法被广泛应用。

以下是使用Java实现余弦相似度算法的示例代码:

import java.util.Map;  
import java.util.HashMap;  
  
public class CosineSimilarity {  
  
    // 计算两个向量的点积  
    private static double dotProduct(Map<String, Double> vec1, Map<String, Double> vec2) {  
        double dotProduct = 0.0;  
        for (String key : vec1.keySet()) {  
            if (vec2.containsKey(key)) {  
                dotProduct += vec1.get(key) * vec2.get(key);  
            }  
        }  
        return dotProduct;  
    }  
  
    // 计算向量的欧几里得长度(L2范数)  
    private static double magnitude(Map<String, Double> vector) {  
        double sum = 0.0;  
        for (Double value : vector.values()) {  
            sum += Math.pow(value, 2);  
        }  
        return Math.sqrt(sum);  
    }  
  
    // 计算两个向量的余弦相似度  
    public static double cosineSimilarity(Map<String, Double> vec1, Map<String, Double> vec2) {  
        double dotProduct = dotProduct(vec1, vec2);  
        double magnitude1 = magnitude(vec1);  
        double magnitude2 = magnitude(vec2);  
  
        if (magnitude1 == 0 || magnitude2 == 0) {  
            return 0; // 如果任一向量为零向量,则相似度为0  
        }  
  
        return dotProduct / (magnitude1 * magnitude2);  
    }  
  
    public static void main(String[] args) {  
        // 示例向量  
        Map<String, Double> vec1 = new HashMap<>();  
        vec1.put("A", 1.0);  
        vec1.put("B", 2.0);  
        vec1.put("C", 3.0);  
  
        Map<String, Double> vec2 = new HashMap<>();  
        vec2.put("A", 1.0);  
        vec2.put("B", 2.0);  
        vec2.put("C", 4.0);  
  
        // 计算余弦相似度  
        double similarity = cosineSimilarity(vec1, vec2);  
        System.out.println("Cosine Similarity: " + similarity);  
    }  
}

在上面的代码中,我们定义了两个辅助方法dotProduct和magnitude,分别用于计算两个向量的点积和向量的欧几里得长度(L2范数)。cosineSimilarity方法则利用这两个辅助方法来计算两个向量的余弦相似度。

在main方法中,我们创建了两个示例向量vec1和vec2,然后调用cosineSimilarity方法来计算它们之间的余弦相似度,并将结果打印出来。

请注意,这只是一个简单的示例,用于说明余弦相似度算法的基本实现。在实际应用中,向量可能非常大,包含成千上万个维度,因此可能需要使用更高效的数据结构和算法来处理这些向量。此外,对于稀疏向量(即大多数元素为0的向量),可能需要使用特定的稀疏矩阵技术来优化性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值