Vue d’ensemble
Dans la similarité cosinus, les objets de données dans un ensemble de données sont traités comme des vecteurs, et elle utilise la valeur du cosinus de l'angle entre deux vecteurs pour indiquer la similarité entre eux. Dans le graph, en spécifiant N propriétés numériques (caractéristiques) des nodes pour former des vecteurs N-dimensionnels, deux nodes sont considérés similaires si leurs vecteurs sont similaires.
La similarité cosinus varie de -1 à 1; 1 signifie que les deux vecteurs ont la même direction, -1 signifie que les deux vecteurs ont la direction opposée.
Dans un espace 2-dimensionnel, la similarité cosinus entre les vecteurs A(a1, a2) et B(b1, b2) est calculée comme suit :
Dans un espace 3-dimensionnel, la similarité cosinus entre les vecteurs A(a1, a2, a3) et B(b1, b2, b3) est calculée comme suit :
Le schéma suivant montre la relation entre les vecteurs A et B dans les espaces 2D et 3D, ainsi que l'angle θ entre eux :
Généraliser à un espace N-dimensionnel, la similarité cosinus est calculée comme suit :
Considérations
- Théoriquement, le calcul de la similarité cosinus entre deux nodes ne dépend pas de leur connectivité.
- La valeur de la similarité cosinus est indépendante de la longueur des vecteurs, mais seulement de la direction des vecteurs.
Syntaxe
- Commande:
algo(similarity)
- Paramètres:
Nom |
Type |
Specification |
Par défaut |
Optionnel |
Description |
---|---|---|---|---|---|
ids / uuids | []_id / []_uuid |
/ | / | Non | ID/UUID du premier groupe de nodes à calculer |
ids2 / uuids2 | []_id / []_uuid |
/ | / | Oui | ID/UUID du second groupe de nodes à calculer |
type | string | cosine |
cosine |
Oui | Type de similarité ; pour la similarité cosinus, garder cosine |
node_schema_property | []@<schema>?.<property> |
Type numérique, doit être LTE | / | Non | Spécifier deux ou plusieurs propriétés de nodes pour former les vecteurs, toutes les propriétés doivent appartenir au même (un) schema |
limit | int | ≥-1 | -1 |
Oui | Nombre de résultats à retourner, -1 pour retourner tous les résultats |
top_limit | int | ≥-1 | -1 |
Oui | En mode sélection, limiter le nombre maximum de résultats retournés pour chaque node spécifié dans ids /uuids , -1 pour retourner tous les résultats avec similarité > 0; en mode couplage, ce paramètre est invalide |
L'algorithme a deux modes de calcul :
- Couplage : quand à la fois
ids
/uuids
etids2
/uuids2
sont configurés, coupler chaque node dansids
/uuids
avec chaque node dansids2
/uuids2
(ignorer le même node) et calculer les similarités par paires. - Sélection : quand seul
ids
/uuids
est configuré, pour chaque node cible, calculer les similarités par paires entre celui-ci et tous les autres nodes dans le graph. Les résultats retournés incluent tous ou un nombre limité de nodes ayant une similarité > 0 avec le node cible et sont classés par similarité décroissante.
Exemples
Le graph d'exemple a 4 produits (les arêtes sont ignorées), chaque produit a des propriétés price, weight, weight et height:
File Writeback
Specification | Contenu |
---|---|
filename | node1 ,node2 ,similarity |
algo(similarity).params({
uuids: [1],
uuids2: [2,3,4],
node_schema_property: ['price', 'weight', 'width', 'height']
}).write({
file:{
filename: 'cs_result'
}
})
Résultats : Fichier cs_result
product1,product2,0.986529
product1,product3,0.878858
product1,product4,0.816876
algo(similarity).params({
uuids: [1,2,3,4],
node_schema_property: ['price', 'weight', 'width', 'height'],
type: 'cosine'
}).write({
file:{
filename: 'list'
}
})
Résultats : Fichier list
product1,product2,0.986529
product1,product3,0.878858
product1,product4,0.816876
product2,product1,0.986529
product2,product3,0.934217
product2,product4,0.881988
product3,product2,0.934217
product3,product4,0.930153
product3,product1,0.878858
product4,product3,0.930153
product4,product2,0.881988
product4,product1,0.816876
Direct Return
Alias Ordinal |
Type |
Description | Colonnes |
---|---|---|---|
0 | []perNodePair | Paire de nodes et sa similarité | node1 , node2 , similarity |
algo(similarity).params({
uuids: [1,2],
uuids2: [2,3,4],
node_schema_property: ['price', 'weight', 'width', 'height'],
type: 'cosine'
}) as cs
return cs
Résultats : cs
node1 | node2 | similarity |
---|---|---|
1 | 2 | 0.986529413529119 |
1 | 3 | 0.878858407519654 |
1 | 4 | 0.816876150267203 |
2 | 3 | 0.934216530725663 |
2 | 4 | 0.88198819302226 |
algo(similarity).params({
uuids: [1,2],
type: 'cosine',
node_schema_property: ['price', 'weight', 'width', 'height'],
top_limit: 1
}) as top
return top
Résultats : top
node1 | node2 | similarity |
---|---|---|
1 | 2 | 0.986529413529119 |
2 | 1 | 0.986529413529119 |
Stream Return
Alias Ordinal |
Type |
Description | Colonnes |
---|---|---|---|
0 | []perNodePair | Paire de nodes et sa similarité | node1 , node2 , similarity |
algo(similarity).params({
uuids: [3],
uuids2: [1,2,4],
node_schema_property: ['@product.price', '@product.weight', '@product.width'],
type: 'cosine'
}).stream() as cs
where cs.similarity > 0.8
return cs
Résultats : cs
node1 | node2 | similarity |
---|---|---|
3 | 2 | 0.883292081301959 |
3 | 4 | 0.877834381494613 |
algo(similarity).params({
uuids: [1,3],
node_schema_property: ['price', 'weight', 'width', 'height'],
type: 'cosine',
top_limit: 1
}).stream() as top
return top
Résultats : top
node1 | node2 | similarity |
---|---|---|
1 | 2 | 0.986529413529119 |
3 | 2 | 0.934216530725663 |