Получение k похожих строк в матрице для каждой строки через косинусное сходство в R

Как эффективно получить лучшие K-подобные векторы по косинусному сходству с использованием R? спрашивает, как вычислить лучшие похожие векторы для каждого вектора одна матрица относительно другой матрицы. Это удовлетворительный ответ, и я хотел бы настроить его для работы с одной матрицей.

То есть мне нужны k лучших похожих других строк для каждой строки в матрице. Я подозреваю, что решение очень похоже, но может быть оптимизировано.


person Max Ghenis    schedule 26.09.2015    source источник


Ответы (1)


Эта функция основана на связанном ответе:

CosineSimilarities <- function(m, top.k) {
  # Computes cosine similarity between each row and all other rows in a matrix.
  #
  # Args:
  #   m: Matrix of values.
  #   top.k: Number of top rows to show for each row.
  #
  # Returns:
  #   Data frame with columns for pair of rows, and cosine similarity, for top
  #   `top.k` rows per row.
  #   
  # Similarity computation
  cp <- tcrossprod(m)
  mm <- rowSums(m ^ 2)
  result <- cp / sqrt(outer(mm, mm))
  # Top similar rows from train (per row)
  # Use `top.k + 1` to remove the self-reference (similarity = 1)
  top <- apply(result, 2, order, decreasing=TRUE)[seq(top.k + 1), ]
  result.df <- data.frame(row.id1=c(col(top)), row.id2=c(top))
  result.df$cosine.similarity <- result[as.matrix(result.df[, 2:1])]
  # Remove same-row records and return
  return(result.df[result.df$row.id1 != result.df$row.id2, ])
}

Например:

(m <- matrix(1:9, nrow=3))
#      [,1] [,2] [,3]
# [1,]    1    4    7
# [2,]    2    5    8
# [3,]    3    6    9
CosineSimilarities(m, 1)
#   row.id1 row.id2 cosine.similarity
# 2       1       2            0.9956
# 4       2       3            0.9977
# 6       3       2            0.9977
person Max Ghenis    schedule 26.09.2015