косинусное сходство и исчерпанная память в R: вычислить косинусное сходство вектора с любым другим вектором в матрице - PullRequest
0 голосов
/ 25 февраля 2020

Мне интересно найти сходство конкретного вектора (1), принадлежащего матрице, с любыми другими векторами (v1, v2, v3, v4 и т. Д. c.) В матрице, а затем отобразить список наиболее похожие. это код, который я использую до сих пор. Это работает, но у него есть проблемы, когда матрица начинает становиться слишком большой, поскольку я, вероятно, превышаю память в R. Я понял, что, возможно, я делаю не самую эффективную вещь, поскольку я в настоящее время вычисляю косинусное сходство для всей матрицы, в то время как я Интересует только косинусное сходство моего вектора с любым другим вектором в матрице

. Вот пример структуры моих данных:

complete_table (последняя строка - целевой вектор, который я хочу вычислить косинусное сходство по всем остальным векторам):

       c1    c2    c3    c4    c5     c6     c7     c8   
  v1   1     1     2     2     4      3       1      1
  v2   3     3     2     1     5      2       1      2 
  v3   3     4     2     0     0      0       0      9
  v4   4     5     5     5     4      0       0      0
  v5   0     0     0     0     8      7       8      6
   1   5     0     0     0     0      6       0      0

функция, которую я использую:

cosineDist <- function(x){
  as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) 
}

matrix <- as.matrix(complete_table)
results <- as.matrix(cosineDist(matrix1))

results_simil <- as.data.frame(results[1:nrow(complete_table)-1,nrow(complete_table)])

colnames(results_simil) <- "similarity_with_proxy_score(0_max)"
results_simil$match_score <- 1-results_simil$`similarity_with_proxy_score(0_max)`

, так что в основном в results_simil я нахожу сходство «1» с любым v1, v2 и т. д. c

как я могу добиться того же результата более эффективным способом, чтобы я вычислял только косинусное сходство для целевого вектора "1" (тот, что в последней строке), а не вся матрица?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...