Подтвердить что ты не робот

Найти сходство косинусов между двумя массивами

Мне интересно, есть ли встроенная функция в R, которая может найти сходство косинусов (или косинусное расстояние) между двумя массивами?

В настоящее время я реализовал свою собственную функцию, но не могу не думать, что R уже должен быть с ней.

4b9b3361

Ответ 1

Такие вопросы возникают постоянно (для меня - и, как видно из списка вопросов SO, помеченных как SO), другие:

есть ли функция, либо в R-ядре, либо в любом R-пакете, который делает x? и если да,

Где я могу найти его среди +2000 R пакетов в CRAN?

короткий ответ: дайте пакет sos попробовать, когда появятся такие вопросы

Один из ранних ответов дал косинус вместе со ссылкой на страницу справки. Вероятно, это именно то, чего хочет OP. Когда вы смотрите на связанную страницу, вы видите, что эта функция находится в пакете lsa.

Но как вы найдете эту функцию, если вы еще не знаете, какой пакет искать в ней?

вы всегда можете попробовать стандартные функции справки R ( " > " ниже означает только командную строку R):

> ?<some_name>

> ??<some_name>

> *apropos*<some_name>

если они не работают, затем установите и загрузите пакет sos, затем

***findFn***

findFn также псевдоним к "???", хотя я не часто его использую, потому что я не думаю, что вы можете передавать аргументы, отличные от имени функции

для вопроса здесь, попробуйте следующее:

> library(sos)

> findFn("cosine", maxPages=2, sortby="MaxScore")

Дополнительные аргументы, переданные в ( "maxPages = 2" и "sortby =" MaxScore "), просто ограничивают количество возвращаемых результатов и определяют, как ранжируются результаты, соответственно, то есть" найти функцию с именем "косинус" 'или который имеет термин "косинус" в описании функции, возвращает только две страницы результатов и упорядочивает их по убыванию значения релевантности "

Вызов findFn возвращает фрейм данных с девятью столбцами, а результаты - в виде строк - отображаются как HTML.

Сканирование последнего столбца, Описание и ссылка, элемент (строка) 21 вы найдете:

Косинусные меры (матрицы)

этот текст также является ссылкой; нажатие на нее приведет к странице справки для этой функции в пакете, который содержит эту функцию - другими словами

используя findFn, вы можете довольно быстро найти нужную функцию , даже если, о которой вы не знаете, какой пакет она находится в

Ответ 2

Похоже, что уже есть несколько вариантов, но я просто наткнулся на идиоматическое решение, которое мне нравится, поэтому я подумал, что добавлю его в список.

install.packages('proxy') # Let be honest, you've never heard of this before.
library('proxy') # Library of similarity/dissimilarity measures for 'dist()'
dist(m, method="cosine")

Ответ 3

Взяв комментарий от Джонатана Чанга, я написал эту функцию, чтобы имитировать dist. Никаких дополнительных пакетов для загрузки.

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

Ответ 5

Вы также можете проверить пакет vegan: http://cran.r-project.org/web/packages/vegan//index.html

Функция vegdist в этом пакете имеет множество функций несходства (расстояния), таких как manhattan, euclidean, canberra, bray, kulczynski, jaccard, gower, altGower, morisita, horn, mountford, raup, binomial, chao или cao. Пожалуйста, проверьте .pdf в пакете для определения или обратитесь к ссылкам https://stats.stackexchange.com/a/33001/12733.

Ответ 6

Если у вас есть матрица точечного произведения, вы можете использовать эту функцию для вычисления матрицы подобия косинуса:

get_cos = function(S){
  doc_norm = apply(as.matrix(dt),1,function(x) norm(as.matrix(x),"f")) 
  divide_one_norm = S/doc_norm 
  cosine = t(divide_one_norm)/doc_norm
  return (cosine)
}

Вход S - матрица точечного произведения. Просто S = dt %*% t(dt), где dt - ваш набор данных.

Эта функция в основном состоит в том, чтобы разделить произведение точек на нормы векторов.