2012-10-14 4 views
3

Je me demandais s'il existait une implémentation dans R où trie une permutation de n nombres dans la séquence 1 ... n originale et fournit le nombre d'inversions nécessaires. Par exemple, une implémentation du "tri par inversion" ou du "tri par translocation" comme indiqué dans ce ppt.R implémentation du tri par inversions

Plus précisément, j'ai une permutation d'une séquence de n éléments, pi (n), et je veux comprendre à quel point il est proche de la séquence originale. Le nombre d'inversions semble être une bonne mesure.

Merci!

+2

cela ne répond pas tout à fait à votre question, mais le tau de Kendall http://en.wikipedia.org/wiki/Kendall_tau_rank_correlation_coefficient donne une statistique qui semble très appropriée dans ce contexte (valeur mise à l'échelle de [# paires concordantes] - [# paires discordantes]); 'cor.test (..., method =" kendall ")' renvoie la valeur pour les valeurs x et y spécifiées (ie 'cor.test (seq (n), pi (n), méthode =" kendall ") $ statistique ') –

Répondre

2

Cela ressemble à un travail pour la distance de Kendall (aussi connu, parfois, que la distance de tri Bubble). C'est probablement la métrique la plus couramment utilisée pour mesurer la distance dans l'espace de classement.

La distance de Kendall compte le nombre de fois que deux séquences diffèrent dans l'ordre des éléments dans deux indices. Dans le cas où l'une des séquences est la séquence triviale (1, 2, ..., n), on peut mesurer la distance simplement en comptant le nombre de fois que i < j et pi (i)> pi (j) .

Si vous aimez cette métrique (elle équivaut au nombre minimum de transpositions par paire d'éléments adjacents que vous auriez à compléter pour transformer une séquence en 1: n), vous pouvez la trouver dans mon package, RMallow, disponible sur CRAN. La fonction s'appelle AllSeqDists. Voici un exemple:

library(RMallow) 
# Create a matrix of sequences, each of length 5 
datas <- matrix(c(1:5, 5:1, c(2, 1, 3, 4, 5), c(5, 1, 2, 3, 4), c(1, 2, 4, 5, 6), c(1, 5, 6, 2, 4)), nrow = 6, byrow = TRUE) 
# Calculate all of their Kendall distances to the sequence (1, 2, 3, 4, 5) 
datas <- SimplifySequences(datas) 
dists <- AllSeqDists(datas) 

Vous pourriez également considérer la métrique de Spearman.
En outre, il existe une classe de modèles sur les données de classement que je dois brancher appelée "modèles Mallows", en fonction de ce que vous voulez faire.

+0

Salut, cela semble très bien! AllSeqDists fonctionnerait-il s'il y avait un écart dans la séquence (par exemple 4,2,1,5,6)? – user1357015

+0

En outre, est-ce différent de la distance Damerau-Levenshtein avec seulement des transpositions autorisées? – user1357015

+0

@ user137015 J'ai mis à jour ma réponse pour refléter des fonctionnalités supplémentaires pour répondre à votre première question. Et la réponse à votre deuxième question est: évidemment, elle est identique, et vous avez trouvé un autre nom pour cette métrique! – Rguy

Questions connexes