Найти косинусное сходство между двумя массивами - PullRequest
26 голосов
/ 29 марта 2010

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

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

Ответы [ 6 ]

67 голосов
/ 29 марта 2010

Подобные вопросы возникают постоянно (для меня - и как свидетельствует список вопросов, помеченный тегом r - и другие):

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

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

короткий ответ: попробуйте sos package , когда возникнут вопросы такого рода

Один из предыдущих ответов дал косинус вместе со ссылкой на его страницу помощи. Это, вероятно, именно то, что хочет ОП. Когда вы смотрите на связанную страницу, вы видите, что эта функция находится в пакете 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 "), просто ограничивают количество возвращаемых результатов и указывают, как результаты ранжируются соответственно, то есть" находят функцию с именем "cosine" 'или который имеет термин' косинус 'в описании функции, возвращает только две страницы результатов и упорядочивает их по убыванию оценки релевантности "

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

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

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

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

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

22 голосов
/ 09 января 2014

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

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")
16 голосов
/ 23 октября 2013

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

cosineDist <- function(x){
  as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) 
}
9 голосов
/ 29 марта 2010
5 голосов
/ 25 июля 2012

Вы также можете проверить пакет 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.

0 голосов
/ 31 марта 2016

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

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 - ваш набор данных.

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

...