Definición
Nuevo en la versión 8.3.
$similarityCosineDevuelve la similitud coseno entre dos vectores numéricos representados como arreglos o valores de
binData. La similitud del coseno mide el coseno del ángulo entre dos vectores e indica cuán similares son sus direcciones, independientemente de sus magnitudes.$similarityCosinetiene dos formas de sintaxis.La sintaxis concisa devuelve una puntuación bruta de similitud coseno:
{ $similarityCosine: [ <vector1>, <vector2> ] } Sintaxis completa acepta un parámetro opcional de normalización:
{ $similarityCosine: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Al utilizar la sintaxis completa, acepta los siguientes
$similarityCosinecampos:CampoTipoNecesidadDescripciónvectorsArreglo
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.scoreBooleano
Opcional
Cuando
true, devuelve una puntuación normalizada en el rango[0, 1]utilizando la fórmula(1 + cosine) / 2. Por defecto esfalse.Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
null y valores faltantes
Si alguno de los argumentos se resuelve en null o hace referencia a un campo faltante, $similarityCosine nulldevuelve.
Vectores de magnitud cero
Si alguno de los vectores de entrada tiene una magnitud de cero (es decir, todos los elementos 0 son), $similarityCosine 0devuelve.
Valor de retorno
$similarityCosine devuelve double un. Cuando score es false (el valor predeterminado), el resultado es el valor de similitud del coseno sin procesar en el [-1, 1] rango:
1indica que los vectores apuntan en direcciones idénticas.0indica que los vectores son ortogonales.-1indica que los vectores apuntan en direcciones opuestas.
Cuando score es true, el resultado se normaliza al rango [0, 1] con la fórmula (1 + cosine) / 2.
Errors
$similarityCosine 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
binDatatienen diferentes longitudes.Cualquiera de los arreglos contiene elementos no numéricos.
Ejemplo
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 cadena de agregación calcula la similitud del coseno entre los campos a y b para cada documento y devuelve tanto la puntuación cruda como la puntuación normalizada:
db.vectors.aggregate( [ { $project: { raw: { $similarityCosine: [ "$a", "$b" ] }, normalized: { $similarityCosine: { vectors: [ "$a", "$b" ], score: true } } } } ] )
La operación devuelve los siguientes resultados:
{ _id: 1, raw: 1, normalized: 1 } { _id: 2, raw: 0.7142857142857143, normalized: 0.8571428571428571 } { _id: 3, raw: 0.9746318461970762, normalized: 0.9873159230985381 }