Uno de los problemas que se enfrentarían si se usa scipy.cluster.vq.kmeans
es que esa función usa la distancia euclidiana para medir la cercanía. Para adaptar su problema a uno que pueda resolverse mediante el clúster k-means
, debe encontrar la manera de convertir sus cadenas en vectores numéricos y poder justificar el uso de la distancia euclidiana como una medida razonable de cercanía.
Eso parece ... difícil. Quizás estás buscando Levenshtein distance en su lugar?
Tenga en cuenta que hay variants of the K-means algorithm que pueden funcionar con métricas de distancia que no sean Euclideance (como la distancia Levenshtein). K-medoids
(también conocido como PAM), por ejemplo, can be applied to data with an arbitrary distance metric.
Por ejemplo, usando Pycluster
's aplicación de k-medoids
, y nltk
's aplicación de Levenshtein distancia,
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)
produce un resultado como
['apple', 'Doppler', 'applaud', 'append']
['stake', 'steak', 'teak', 'sleek']
['barker', 'baker', 'bismark', 'park']
Esta respuesta no tiene ningún sentido. ¿Cuál es la "distancia" entre dos cadenas de ARN tal que A) obedece a la desigualdad del triángulo y B) es euclidiana? Hay muchos algoritmos de agrupamiento, y parece que no sé cómo los k-means en particular serían útiles en esta circunstancia. – sclv
La distancia que estoy utilizando es la distancia estructural, por ejemplo, secuencias: (1) "(((....)))" y (2) "(((((..)))) " Ten una distancia de 1 desde la única diferencia en una inserción – Doni
Jerry, ¿puedes explicar cómo esto puede funcionar? Como @sclv mencionó en su respuesta, K-means solo funciona con distancia euclidiana. parece imposible aplicarlo a las cadenas, ya que en cada paso, necesita desplazar los centroides a una posición absoluta que represente la media de los puntos de datos más cercanos ... Para las métricas de distancia arbitrarias, parece que [** K-medoids **] (https://en.wikipedia.org/wiki/K-medoids) funcionaría en su lugar ya que usa puntos de datos como centroides en su lugar. – Adam