матрица расстояний для матрицы размером 100k * 100k в R

1

У меня есть вектор A размера 100k+, и я хочу рассчитать расстояние между каждым элементом этого вектора с каждым другим элементом. Я пытаюсь решить эту проблему в R, используя встроенную функцию adist, а также пытаюсь использовать пакет stringdist. Проблема в том, что она является очень сложной и она работает в течение нескольких дней, не заканчивая.

Конечная проблема, которую я пытаюсь решить, заключается в поиске дубликатов или почти дубликатов с использованием меры расстояния, а затем создайте вокруг нее какую-то классификационную модель.

Код, который я использую в настоящее время

 # declare an empty data frame and append data to it
matchedStr_vecA <- data.frame(row_index = integer(),
                              col_index = integer(),
                              vecA_i = character(),
                              vecA_j = character(),
                              dist_diff_vecA = double(),
                              stringsAsFactors=FALSE)


k = 1 # (keeps track of the pointer to the data frame)
# Run 2 different loops to calculate the bottom half of the matrix (below the diagonal - 
# as the diagonal elements will be zero and the upper half is the mirror image of the bottom half)
for (i in 1:length(vecA)) { 
  for (j in 1:length(vecA)) { 
    if (i < j) {
      dist_diff_vecA <- stringdist(vecA[i], vecA[j], method = "lv")
      matchedStr_invId[k,] <- c(i, j, vecA[i], vecA[j], dist_diff_vecA)
      k <- k + 1
    }
  }
}

Пожалуйста, помогите мне привести это вычисление от O (n ^ 2) к O (n). Я в порядке с использованием python. Мне сказали, что это можно решить с помощью программирования динамического программирования, но я не уверен, как его реализовать.

Спасибо всем

  • 0
    Во-первых, вы знаете алгоритм?
  • 0
    Вы хотите choose(100e3, 2) сравнения. Это обязательно отнимает много времени, но вы должны делать это с помощью скомпилированного языка и / или массового распараллеливания. Конечно, было бы гораздо лучше перейти от грубой силы к разумному подходу к тому, чего вы на самом деле пытаетесь достичь.
Показать ещё 4 комментария
Теги:
string
matrix
duplicates

1 ответ

0

У меня была та же самая проблема вычисления матрицы расстояния, и я успешно ее разрешил в Python. В этом вопросе обсуждаются важнейшие элементы решения, обеспечивающие одинаковое распределение расчётов между потоками: как разбить диагональную матрицу на равное количество элементов по одной оси?

Следует отметить две вещи:

  1. Расстояние между двумя точками обычно симметрично, поэтому вы можете повторно использовать эту математическую функцию и вычислить расстояние между i и j элементами один раз и либо сохранить его, либо повторно использовать для расстояния между j и i.

  2. Алгоритм не может быть оптимизирован ниже O (n ^ 2), если вы не в порядке с неточными результатами. И поскольку вы новичок в программировании, я бы даже не подумал об этом.

  3. Вы должны иметь возможность распараллеливать вычисления, используя расщепление индексов, как я предложил в вышеприведенном вопросе для почти оптимального решения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню