Y a-t-il un moyen général de convertir entre une mesure de la similitude et une mesure de distance?
Considérez une mesure de similarité comme le nombre de 2 grammes que deux chaînes ont en commun. P>
2-grams('beta', 'delta') = 1 2-grams('apple', 'dappled') = 4
9 Réponses :
similarity = 1/difference and watch out for difference = 0
Donc, on pourrait essayer avec similarité = 1 / (différence + 1) code>
Dans le cas de la distance de Levenshtein, vous pouvez augmenter le score SIM par 1 pour chaque fois que les séquences correspondent; C'est à chaque fois que vous n'avez pas besoin d'une suppression, d'une insertion ou d'une substitution. De cette façon, la métrique serait une mesure linéaire du nombre de caractères dont les deux cordes ont en commun. p>
Si votre (des) mesure de similarité est comprise entre 0 et 1, vous pouvez utiliser l'une d'entre elles:
1-s sqrt(1-s) -log(s) (1/s)-1
Dans l'un de mes projets (basé sur le filtrage collaboratif), je devais convertir entre corrélation (cosinus entre vecteurs) de -1 à 1 (plus près 1 est plus similaire de -1 est plus diversifié) à distance normalisée (près de 0 la distance est plus petite et si elle est proche de 1 la distance est plus grande) p>
Dans ce cas: distance ~ Diversité p>
Ma formule était: Si vous avez une similitude avec la diversité et que le domaine est [0,1] dans les deux cas, la manière SimLest est la suivante: P>
dist = 1 - (Cor + 1) / 2 code> p>
dist = 1 - sim code> p>
sim = 1 - dist code> p>
faire 1 / similarité ne va pas garder les propriétés de la distribution. P>
Le meilleur moyen est Distance (A-> B) = Similaire la plus élevée - Sa similarité (A-> B). La plus grande similitude étant la similitude avec la plus grande valeur. Vous allongez donc votre distribution. La plus haute similarité devient 0 etc p>
Laisser d fort> désigne la distance, s fort> indique une similitude. Pour convertir la mesure de distance en mesure de similitude, nous devons d'abord normaliser s fort> = 1 - où s strud> est compris dans la plage [0 1], avec 1 indique une similitude la plus élevée (les éléments en comparaison sont identiques) et 0 indique la plus grande similarité (la plus grande distance). P>
Similarité de cosinus est largement utilisé pour les vecteurs N-GRAM ou TFIDF.
>>> import Tokenizer >>> tokenizer = Tokenizer(ngrams=2, lower=True, nonwords_set=set(['hello', 'and'])) >>> from Collections import Counter >>> list(tokenizer('Hello World again and again?')) ['world', 'again', 'again', 'world again', 'again again'] >>> Counter(tokenizer('Hello World again and again?')) Counter({'again': 2, 'world': 1, 'again again': 1, 'world again': 1}) >>> x = _ >>> Counter(tokenizer('Hi world once again.')) Counter({'again': 1, 'world once': 1, 'hi': 1, 'once again': 1, 'world': 1, 'hi world': 1, 'once': 1}) >>> y = _ >>> sum(x[k]*y[k] for k in x if k in y) / sum(v**2 for v in x.values())**.5 / sum(v**2 for v in y.values())**.5 0.42857142857142855 >>> distance_metric(x, y) 0.28196592805724774
Oui, il y a un moyen le plus général strong> de changer entre similarité em> et distance em>: un strictement monotone décroissant fort> fonction c'est-à-dire, avec Exemples: strong> p>
Ce sont des candidats à la diminution strictement monotone strictement connus qui travaillent pour Similités ou distances non négatives EM>: p>
Vous pouvez choisir le paramètre EDIT 2021-08 P>
blockQuote>
Une approche très pratique consiste à utiliser la fonction sim2diss appartenant à la logiciel statistique R . Ces fonctions fournissent jusqu'à 13 méthodes pour calculer la dissimilarité des similitudes. Malheureusement, les méthodes ne sont pas du tout expliquées: vous devez Recherchez le code A>: - \ p> f (x) code>. p>
f (x) code> vous pouvez faire
similaire = f (distance) code> ou
distance = f (similarité) code>. Cela fonctionne dans les deux sens. Une telle fonction fonctionne, car la relation entre la similarité et la distance est que l'on diminue lorsque l'autre augmente. P>
f (x) = 1 / (A + x) code> li>
f (x) = exp (- x ^ a code>) li>
f (x) = arccot (haché) code> li>
ul>
a> 0 code> (par exemple,
a = 1 code>) p>
Je n'ai jamais vu: arccot (hache)
@ user3352632 Voir sur Wolfram ou Wikipedia, Fonctions trigonométriques inverse
Je veux dire que quelqu'un l'a utilisé dans un document de recherche
C'est génial. Vous pouvez être le premier à utiliser ArcCot () en tant que relation entre la similitude et la dissimilarité dans une recherche et faire de l'histoire! ;)
Selon Scikit apprendre : P>
Les noyaux sont des mesures de similitude, c'est-à-dire une (A, B)> S (A, C) si des objets A et B sont considérés comme "plus similaires" que des objets A et C. Un noyau doit également être positif semi-défini. P>
Il existe un certain nombre de façons de convertir entre une métrique à distance et une mesure de similarité, telle qu'un noyau. Soit d la distance et s soit le noyau: p>
Je suis curieux de savoir si votre problème nécessite que la distance obéys Inégalité de triangle et si oui quels Ces solutions que vous avez trouvées la plus satisfaisante.