12
votes

Comment puis-je convertir entre une mesure de similitude et une mesure de la différence (distance)?

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


1 commentaires

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.


9 Réponses :


1
votes
similarity = 1/difference
and watch out for difference = 0

1 commentaires

Donc, on pourrait essayer avec similarité = 1 / (différence + 1)



0
votes

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.


0 commentaires

4
votes

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


0 commentaires

0
votes

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)

Dans ce cas: distance ~ Diversité

Ma formule était: dist = 1 - (Cor + 1) / 2

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:

dist = 1 - sim

sim = 1 - dist


0 commentaires

5
votes

faire 1 / similarité ne va pas garder les propriétés de la distribution.

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


0 commentaires

12
votes

Laisser d désigne la distance, s indique une similitude. Pour convertir la mesure de distance en mesure de similitude, nous devons d'abord normaliser d à [0 1], en utilisant d_norm = d / max (< fort> d ). Ensuite, la mesure de similarité est donnée par:

s = 1 - d_norm .

s 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).


0 commentaires

0
votes

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


0 commentaires

3
votes

Oui, il y a un moyen le plus général de changer entre similarité et distance : un strictement monotone décroissant fonction f (x) .

c'est-à-dire, avec f (x) vous pouvez faire similaire = f (distance) ou distance = f (similarité) . 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.

Exemples:

Ce sont des candidats à la diminution strictement monotone strictement connus qui travaillent pour Similités ou distances non négatives :

  • f (x) = 1 / (A + x)
  • f (x) = exp (- x ^ a )
  • f (x) = arccot ​​(haché)

    Vous pouvez choisir le paramètre a> 0 (par exemple, a = 1 )

    EDIT 2021-08

    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 : - \


4 commentaires

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! ;)



0
votes

Selon Scikit apprendre :

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.

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:

  • s = np.exp (-D * gamma), où une heuristique pour choisir gamma est 1 / num_features
  • S = 1. / (D / NP.MAX (D))

0 commentaires