Docs Menu
Docs Home
/ /

$similarityEuclidean (operador de expresión)

Nuevo en la versión 8.3.

$similarityEuclidean

Devuelve la distancia euclidiana entre dos vectores numéricos representados como arreglos o valores binData. La distancia euclidiana mide la distancia en línea recta entre dos puntos en el espacio vectorial.

$similarityEuclidean tiene dos formas de sintaxis.

Sintaxis concisa devuelve una distancia euclidiana en crudo:

{ $similarityEuclidean: [ <vector1>, <vector2> ] }

Sintaxis completa acepta un parámetro opcional de normalización:

{
$similarityEuclidean: {
vectors: [ <vector1>, <vector2> ],
score: <boolean>
}
}

Al usar la sintaxis completa, $similarityEuclidean acepta los siguientes campos:

Campo
Tipo
Necesidad
Descripción

vectors

Arreglo

Requerido

Arreglo de exactamente dos expresiones. Cada expresión debe resolverse en un arreglo de valores numéricos o un valor de binData. Ambos vectores deben tener la misma longitud.

score

Booleano

Opcional

Cuando true, devuelve una puntuación normalizada en el rango (0, 1] utilizando la fórmula 1 / (1 + distance). Vectores idénticos producen una puntuación de 1. El valor por defecto es false.

Para obtener más información sobre expresiones, vea expresión.

Si alguno de los argumentos se resuelve en null o se refiere a un campo inexistente, $similarityEuclidean devuelve null.

$similarityEuclidean devuelve un double. Cuando score es false (el valor por defecto), el resultado es la distancia euclidiana cruda, que siempre es mayor o igual que 0. Una distancia de 0 significa que los vectores son idénticos. Valores mayores indican mayor disimilitud.

Cuando score es true, el resultado se normaliza al rango (0, 1] usando la fórmula 1 / (1 + distance):

  • 1 indica que los vectores son idénticos (la distancia es 0).

  • Valores cercanos a 0 indican mayor disimilitud.

$similarityEuclidean devuelve un error en los siguientes casos:

  • Ningún argumento se resuelve en un arreglo o en un valor binData.

  • Los arreglos de entrada o los valores binData tienen diferentes longitudes.

  • Cualquiera de los arreglos contiene elementos no numéricos.

El siguiente ejemplo utiliza una colección vectors:

db.vectors.insertMany( [
{ _id: 1, a: [1, 2, 3], b: [1, 2, 3] },
{ _id: 2, a: [1, 2, 3], b: [3, 2, 1] },
{ _id: 3, a: [1, 2, 3], b: [4, 5, 6] }
] )

La siguiente pipeline de agregación calcula la distancia euclidiana entre los campos a y b para cada documento y devuelve tanto la distancia bruta como la puntuación normalizada:

db.vectors.aggregate( [
{
$project: {
raw: { $similarityEuclidean: [ "$a", "$b" ] },
normalized: {
$similarityEuclidean: {
vectors: [ "$a", "$b" ],
score: true
}
}
}
}
] )

La operación devuelve los siguientes resultados:

{ _id: 1, raw: 0, normalized: 1 }
{ _id: 2, raw: 2.8284271247461903,
normalized: 0.2612038749637415 }
{ _id: 3, raw: 5.196152422706632,
normalized: 0.16139702886038895 }

Volver

$similarityDotProduct

En esta página