Definição
Novidades na versão 8.3.
$similarityCosineRetorna a similaridade do cosseno entre dois vetores numéricos representados como arrays ou valores
binData. A similaridade do cosseno mede o cosseno do ângulo entre dois vetores e indica quão semelhantes são suas direções, independentemente de suas magnitudes.$similarityCosinetem dois formatos de sintaxe .A sintaxe concisa retorna uma pontuação bruta de similaridade de cosseno:
{ $similarityCosine: [ <vector1>, <vector2> ] } A sintaxe completa aceita um parâmetro de normalização opcional:
{ $similarityCosine: { vectors: [ <vector1>, <vector2> ], score: <boolean> } } Ao utilizar a sintaxe completa, o aceita os seguintes
$similarityCosinecampos:CampoTiponecessidadeDescriçãovectorsArray
Obrigatório
Array de exatamente duas expressões. Cada expressão deve ser resolvida para uma array de valores numéricos ou um valor
binData. Ambos os vetores devem ter comprimento igual.scoreBoolean
Opcional
Quando
true, retorna uma pontuação normalizada no intervalo[0, 1]usando a fórmula(1 + cosine) / 2. O padrão éfalse.Para mais informações sobre expressões, consulte Expressões do .
Comportamento
null e valores ausentes
Se qualquer um dos argumentos resultar em null ou se referir a um campo ausente, $similarityCosine nullretornará.
Vetores de magnitude zero
Se qualquer um dos vetores de entrada tiver uma magnitude de zero (ou seja, todos os elementos 0 são), $similarityCosine 0retornará.
Valor de retorno
$similarityCosine retorna double um. Quando score é false (o padrão), o resultado é o valor de similaridade do cosseno bruto no [-1, 1] intervalo:
1indica os vetores ponto em direções idênticas.0indica que os vetores são ortogonais.-1indica que os vetores ponto em direções opostas.
Quando score é true, o resultado é normalizado para o intervalo [0, 1] utilizando a fórmula (1 + cosine) / 2.
Errors
$similarityCosine retorna um erro nos seguintes casos:
Qualquer argumento não resulta em uma array ou no valor
binData.Arrays de entrada ou valores
binDatatêm comprimentos diferentes.Qualquer array contém elementos não numéricos.
Exemplo
O exemplo a seguir utiliza uma coleção 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] } ] )
O pipeline de agregação a seguir calcula a similaridade do cosseno entre os campos a e b de cada documento e retorna a pontuação bruta e a pontuação normalizada:
db.vectors.aggregate( [ { $project: { raw: { $similarityCosine: [ "$a", "$b" ] }, normalized: { $similarityCosine: { vectors: [ "$a", "$b" ], score: true } } } } ] )
A operação retorna os seguintes resultados:
{ _id: 1, raw: 1, normalized: 1 } { _id: 2, raw: 0.7142857142857143, normalized: 0.8571428571428571 } { _id: 3, raw: 0.9746318461970762, normalized: 0.9873159230985381 }