Tengo una matriz de dobles, aproximadamente 200,000 filas por 100 columnas, y estoy buscando un algoritmo rápido para encontrar las filas que contienen secuencias más similares a un patrón dado (el patrón puede estar en cualquier lugar de 10 a 100 elementos). Estoy usando Python, por lo que el método de fuerza bruta (código a continuación: iterando sobre cada fila e iniciando el índice de columna, y calculando la distancia euclidiana en cada punto) toma alrededor de tres minutos.Algoritmo rápido para buscar un patrón dentro del archivo de texto
La función numpy.correlate promete resolver este problema mucho más rápido (ejecutando el mismo conjunto de datos en menos de 20 segundos). Sin embargo, simplemente calcula un producto de punto deslizante del patrón sobre la fila completa, lo que significa que para comparar la similitud, primero tendría que normalizar los resultados. La normalización de la correlación cruzada requiere calcular la desviación estándar de cada segmento de los datos, lo que al instante niega la mejora de la velocidad de uso de numpy.correlate en primer lugar.
¿Es posible calcular la correlación cruzada normalizada rápidamente en python? ¿O tendré que recurrir a la codificación del método de fuerza bruta en C?
def norm_corr(x,y,mode='valid'):
ya=np.array(y)
slices=[x[pos:pos+len(y)] for pos in range(len(x)-len(y)+1)]
return [np.linalg.norm(np.array(z)-ya) for z in slices]
similarities=[norm_corr(arr,pointarray) for arr in arraytable]
No sé muy bien, así que solo estoy lanzando una idea: ¿tal vez hay un método de deslizamiento más rápido para calcular el stddev? – liori
Tengo la intención de agregar una curiosidad: probé tu código en mi máquina y se ejecutó en 7 segundos. Sugiero tratar de no crear esa cantidad de objetos de matriz en rodajas, pero aún no sé cómo hacerlo. –