Puis-je utiliser l'algorithme de K-means sur une chaîne de caractères?

je travaille sur un projet python où j'étudie l'évolution de la structure de L'ARN (représentée par une chaîne de caractères par exemple: "(((...)))" où les parenthèses représentent les paires de bases). Le fait est que j'ai une structure idéale et une population qui évolue vers la structure idéale. J'ai tout mis en œuvre mais je voudrais ajouter une fonctionnalité Où je peux obtenir le "nombre de seaux", c'est-à-dire les k structures les plus représentatives de la population à chaque génération.

je suis je pense à utiliser l'algorithme de K-means, mais je ne sais pas comment l'utiliser avec des chaînes. J'ai trouvé scipy.cluster.vq mais je ne sais pas comment l'utiliser dans mon cas.

merci!

12
demandé sur Doni 2011-06-09 17:36:24

3 réponses

k-means ne se soucie pas vraiment du type de données impliquées. Tout ce que vous devez faire un k-means est un moyen de mesurer une "distance" d'un élément à un autre. Il va faire son truc basé sur les distances, indépendamment de la façon dont il se trouve être calculé à partir des données sous-jacentes.

cela dit, je n'ai pas utilisé scipy.cluster.vq, donc je ne suis pas sûr exactement comment vous lui Dites la relation entre les articles, ou comment calculer une distance de l'article A à l'article B.

1
répondu Jerry Coffin 2011-06-09 13:40:15

un problème que vous rencontreriez si vous utilisiez scipy.cluster.vq.kmeans c'est que cette fonction utilise la distance Euclidienne pour mesurer la proximité. Pour transformer votre problème en un problème résolu par k-means clustering, vous devez trouver un moyen de convertir vos chaînes en numérique vecteurs et être en mesure de justifier à l'aide de la distance Euclidienne comme une mesure raisonnable de proximité.

cela semble... difficile. Peut-être que vous êtes à la recherche pour Levenshtein à la place?

Remarque: il n'y variantes de l'algorithme K-means qui peut fonctionner avec des mesures de distance non-Euclideance (comme la distance Levenshtein). K-medoids (alias PAM), par exemple, peut être appliqué à des données avec une métrique de distance arbitraire.

par exemple, en utilisant Pycluster mise en oeuvre de k-medoids et nltk mise en place de Levenshtein,

import nltk.metrics.distance as distance
import Pycluster as PC

words = ['apple', 'Doppler', 'applaud', 'append', 'barker', 
         'baker', 'bismark', 'park', 'stake', 'steak', 'teak', 'sleek']

dist = [distance.edit_distance(words[i], words[j]) 
        for i in range(1, len(words))
        for j in range(0, i)]

labels, error, nfound = PC.kmedoids(dist, nclusters=3)
cluster = dict()
for word, label in zip(words, labels):
    cluster.setdefault(label, []).append(word)
for label, grp in cluster.items():
    print(grp)

donne un résultat comme

['apple', 'Doppler', 'applaud', 'append']
['stake', 'steak', 'teak', 'sleek']
['barker', 'baker', 'bismark', 'park']
11
répondu unutbu 2017-04-13 12:44:13

K - signifie seulement fonctionne avec la distance euclidienne. Éditer des distances comme Levenshtein ne pas même obéir à l'inégalité du triangle peut obéir à l'inégalité du triangle, mais ne sont pas euclidiens. Pour les types de mesures qui vous intéressent, il est préférable d'utiliser un autre type d'algorithme, comme le regroupement hiérarchique:http://en.wikipedia.org/wiki/Hierarchical_clustering

alternativement, il suffit de convertir votre liste D'ARN en un graphe pondéré, avec Levenshtein pèse sur les bords, puis le décompose en un arbre couvrant minimum. Les noeuds les plus connectés de cet arbre seront, en un sens, le "plus représentatif".

8
répondu sclv 2016-03-30 15:43:25