¿Hay alguna manera de acelerar este cálculo de la similitud del coseno entre dos matrices dobles en java?

Nolte:

Tengo dos matrices dobles A y B y desea calcular el coseno similitud entre ellos. Mi código es el siguiente:

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

¿Hay alguna manera de acelerar el tiempo de cálculo?

JBX:

Presumo que su preocupación es para cuando tienes grandes matrices y que desea evitar un bucle a través de ellos dos veces. Como se ha señalado en otras partes, la primera dimensión parece ser redundante en sus funciones, por lo que en la respuesta por debajo de lo evité.

Lo que podría hacer es tratar de combinar los dos bucles juntos en una función.

Algo como:

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

Si realmente necesita 2 dimensiones, llamar a la función anterior en cada dimensión. Así que en su ejemplo que podríamos llamar como si fueracomputeSimilarity(target[0], compare[0]);

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=222406&siteId=1
Recomendado
Clasificación