【问题标题】:Compare Two Vectors (Java)比较两个向量 (Java)
【发布时间】:2010-12-25 15:58:08
【问题描述】:

目前我有两个更大的向量,包含 50 多个字符串

我希望能够比较这两个向量并计算出它们的相似程度。我想我需要使用余弦相似度?

有谁知道有什么方法可以接收两个 Java 向量并给出 0 到 1 之间的值来判断它们的相似程度吗?

谢谢 菲尔

【问题讨论】:

  • 余弦相似度适用于几何向量,不适用于数据结构。定义如何度量 Vector 的相似度,我们可以考虑算法。
  • 请使用改进的ArrayList 类而不是旧的Vector 类。
  • @tkopec - 菲尔希望使用余弦距离来衡量字符串集之间的相似性是正确的。

标签: java vector compare trigonometry


【解决方案1】:

看看 Lucene 中的similarity function

上面的公式是由cosine-distance 或文档和查询向量之间的点积推动的

这是关于此主题的Previous SO question

【讨论】:

    【解决方案2】:

    请参阅Apache Mahout library 了解余弦距离和相关方法的实现。还可以考虑查找 Locality Sensitive Hashing 以获得更快的替代方案。

    【讨论】:

      【解决方案3】:

      执行以下操作

      package com.example;
      
      import java.util.Collection;
      import java.util.HashMap;
      import java.util.Map;
      
      /** Computes the similarity between two bags of words.
       * 1.0 is most similar, 0.0 is most unsimilar.
       *
       */
      public class Cosine {
      
          public static double cosine(Collection<String> a, Collection<String> b) {
              Map<String,Integer> aa = asBag(a);
              Map<String,Integer> bb = asBag(b);
              double sum = 0;
              for (String word: aa.keySet()) {
                  if (!bb.containsKey(word)) continue;
                  sum += aa.get(word) * bb.get(word);
              }
              return sum / (norm(aa) * norm(bb));
          }
      
          private static double norm(Map<String, Integer> bag) {
              double sum = 0;
              for (int each: bag.values()) sum += each * each;
              return Math.sqrt(sum);
          }
      
          private static Map<String,Integer> asBag(Collection<String> vector) {
              Map<String,Integer> bag = new HashMap<String,Integer>();
              for (String word: vector) {
                  if (!bag.containsKey(word)) bag.put(word,0);
                  bag.put(word, bag.get(word) + 1);
              }
              return bag;
          }
      
      }
      

      类型推断,有人吗?

      【讨论】:

      • 我就是这么写的,小心它未经测试。
      猜你喜欢
      • 1970-01-01
      • 2016-06-29
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多