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

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

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

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

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

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

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

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

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

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

 > ? > ?? > *apropos* 

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

 ***findFn*** 

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

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

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

Дополнительные аргументы, переданные в («maxPages = 2» и «sortby =« MaxScore »), просто ограничивают количество возвращаемых результатов и определяют, как оцениваются результаты соответственно, т. Е.« Найти функцию с именем «косинус» или имеет термин «косинус» в описании функции, возвращает только две страницы результатов и упорядочивает их по нисходящей оценке релевантности ”

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

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

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

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

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

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

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

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

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

Проверьте эти функции lsa :: cosine () , clv :: dot_product () и arules :: disimilarity ()

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

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

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

 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 – ваш dataset.

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

Давайте будем гением компьютера.