2011-07-19 8 views
5

Tengo un conjunto de secuencias (por ejemplo, 10000 secuencias) y genero una matriz (10000x10000) que representa la similitud por pares entre cada dos secuencias.Algoritmo de ayuda necesaria

Ahora el objetivo es recuperar un subconjunto (por ejemplo 1000 secuencias) del conjunto grande y asegurarse de que la similitud por pares entre cada dos secuencias en este subconjunto se encuentre entre un rango (por ejemplo, 50% ~ 85%).

¿Hay algún algoritmo rápido para hacerlo?

+0

suena como agruparme –

+0

¿Por qué necesita representar los datos en una matriz? ¿Qué tipo de operaciones está utilizando para extraer el subconjunto? ¿Puedes construir el subconjunto y calcular las similitudes por pares en una sola pasada? –

+0

¿Quieres hacer clustering? – starblue

Respuesta

2

Puede transformar este al problema la teoría de grafos:

  1. Cada secuencia es un nodo
  2. Si similitud de dos nodos está en rango dado que existe una arista entre ellos
  3. Su objetivo es para encontrar los larges connected component (si su relación de similitud es transitiva ...) o los larges clique (... si no).
+0

similitud es casi seguro que no es transitiva, por lo que debe buscar camarillas. ¡buena respuesta! –

+1

¿No encuentra camarillas en un gráfico NP-Hard? Algún algoritmo de aproximación probablemente haría el truco sin embargo. – kyun

0

Puede generar una lista ordenada de similitudes por pares (refiriéndose a su matriz), tomar el subconjunto de esa lista ordenada, luego asegurarse de que la intersección entre esa sublista y su subconjunto sea del mismo tamaño que su subconjunto, por lo tanto verificar que todos los elementos en su subconjunto estén en el rango especificado.

Requiere una gran cantidad de configuración para generar la matriz y un montón de espacio para crear la lista ordenada, sin embargo. Por lo menos, la configuración de su matriz es O (n^2).

0

Esto me suena a "clique finding"; el problema de decisión del grupo es NP-completo.

Dependiendo de las estadísticas detrás de las similitudes de sus secuencias, puede estar satisfecho con un algoritmo de aproximación para el problema de la máxima camarilla. Un algoritmo aleatorizado podría ser lo suficientemente bueno para usted. Pero, en general, este es un problema muy difícil y es poco probable que pueda hacer mucho, incluso para N = 100.

0

Muchas similitudes son equivalentes o están relacionadas con un producto escalar en una n-dimensional espacio, incluso cuando la similitud no se calcula explícitamente como tal. En estos casos, y posiblemente en otros, es probable que valores altos de a.b y b.c impliquen valores altos de a.c, pero el límite para esto no es muy bueno, no tan bueno como pensé que era al principio.

Con solo tres vectores involucrados - a, byc Creo que puede dibujar un diagrama tridimensional independientemente de la dimensionalidad del espacio subyacente, y creo que el peor caso es donde los tres vectores están en un plano, con a above byc debajo de b. En ese caso, p. para todos son vectores unitarios y a.b = b.c = 0.9, a está a unos 25 grados por encima de b y c está a unos 25 grados por debajo de él, y a.c = 0.62. De hecho, para ac = bc = x en este caso, ac = 2x^2 - 1.

En estas circunstancias, si tuviera que resolver este problema en particular, trataría de retroceder búsquedas para enumerar conjuntos de nodos muy cercanos a un nodo particular. Podría, por ejemplo, comenzar con los dos nodos más similares, y luego ejecutar una búsqueda que, en cada nivel, agregara el nodo aún no probado que estaba más cerca de uno de los nodos iniciales originales. O bien, podría compilar un solo clúster de enlace y verificar todos sus subárboles del tamaño requerido.

Cuestiones relacionadas