java - 有什么方法可以加快java中两个 double 组之间的余弦相似度的计算吗?

标签 java arrays math

我有两个 double 组 a 和 b,想要计算它们之间的余弦相似度。我的代码如下所示:

double [][] target = new double [1][65000];
double [][] compare = new double [1][65000];

double dotProduct = dot(target[0], compare[0]);
double eucledianDist = norm2(target) * norm2(compare);
double output = dotProduct / eucledianDist;

private double norm2(double[][] a){
    double sum = 0;
    for (int i = 0; i < a[0].length; i++){
        sum = sum + a[0][i] * a[0][i];
    }
    return Math.sqrt(sum);
}

private double dot(double[] a, double [] b){
    double sum = 0;
    for(int i = 0; i < a.length; i ++){
        sum += a[i] * b[i];
    }
    return sum;
}

有什么办法可以加快计算时间吗?

最佳答案

我认为您担心的是当您有大型数组并且您想避免循环遍历它们两次时。正如其他地方所指出的,第一个维度在您的函数中似乎是多余的,因此在下面的答案中我避免了它。

您可以尝试将两个循环合并到一个函数中。

类似于:

double computeSimilarity(double[] a, double[] b) {
  //todo: you might want to check they are the same size before proceeding

  double dotProduct = 0;
  double normASum = 0; 
  double normBSum = 0;

  for(int i = 0; i < a.length; i ++) {
      dotProduct += a[i] * b[i];
      normASum += a[i] * a[i];
      normBSum += b[i] * b[i];
  }

  double eucledianDist = Math.sqrt(normASum) * Math.sqrt(normBSum);
  return dotProduct / eucledianDist;
}

如果您确实需要 2 个维度,请在每个维度上调用上面的函数。因此,在您的示例中,您可以将其称为 computeSimilarity(target[0], Compare[0]);

关于java - 有什么方法可以加快java中两个 double 组之间的余弦相似度的计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52701842/

相关文章:

arrays - ColdFusion - 循环遍历数组中的嵌套结构

ios - 使用 NSString 变量的名称创建可变数组

c# - MySQL 和 C# 从数据库获取数据并创建关联数组/对象

php - 为什么 PHP 浮点除法和 POW 会给出错误的结果和意想不到的结果?

language-agnostic - 如何编写所有可计算函数的枚举?

java - 如何设置某种类型的空列表

javascript - 用于 JavaScript 日期的 Java SimpleDateFormat 模式

java - 这里抛出任何异常吗?

java - 印地语 kavita 正确对齐/对齐

java - 获取 NaN 作为简单 Java 程序的答案