У меня есть массив значений типа double, примерно 200 000 строк на 100 столбцов, и я ищу быстрый алгоритм для поиска строк, которые содержат последовательности, наиболее похожие на данный шаблон (шаблон может содержать от 10 до 100 элементов ). Я использую python, поэтому метод грубой силы (код ниже: цикл по каждой строке и начальному индексу столбца и вычисление евклидова расстояния в каждой точке) занимает около трех минут.
Функция numpy.correlate обещает решить эту проблему намного быстрее (выполнение по тому же набору данных менее чем за 20 секунд). Однако он просто вычисляет произведение скользящей точки шаблона по всей строке, а это означает, что для сравнения сходства сначала нужно нормализовать результаты. Нормализация взаимной корреляции требует вычисления стандартного отклонения каждого среза данных, что сразу же сводит на нет улучшение скорости использования numpy.correlate в первую очередь.
Можно ли быстро вычислить нормализованную взаимную корреляцию в python? Или мне придется прибегнуть к кодированию метода грубой силы в 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]