У меня есть вектор 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. Мне сказали, что это можно решить с помощью программирования динамического программирования, но я не уверен, как его реализовать.
Спасибо всем
У меня была та же самая проблема вычисления матрицы расстояния, и я успешно ее разрешил в Python. В этом вопросе обсуждаются важнейшие элементы решения, обеспечивающие одинаковое распределение расчётов между потоками: как разбить диагональную матрицу на равное количество элементов по одной оси?
Следует отметить две вещи:
Расстояние между двумя точками обычно симметрично, поэтому вы можете повторно использовать эту математическую функцию и вычислить расстояние между i
и j
элементами один раз и либо сохранить его, либо повторно использовать для расстояния между j
и i
.
Алгоритм не может быть оптимизирован ниже O (n ^ 2), если вы не в порядке с неточными результатами. И поскольку вы новичок в программировании, я бы даже не подумал об этом.
Вы должны иметь возможность распараллеливать вычисления, используя расщепление индексов, как я предложил в вышеприведенном вопросе для почти оптимального решения.
choose(100e3, 2)
сравнения. Это обязательно отнимает много времени, но вы должны делать это с помощью скомпилированного языка и / или массового распараллеливания. Конечно, было бы гораздо лучше перейти от грубой силы к разумному подходу к тому, чего вы на самом деле пытаетесь достичь.