赞
踩
余弦相似度(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的向量),可能需要使用特定的稀疏矩阵技术来优化性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。