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

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

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

6 ответов


такого рода вопросы возникают все время (для меня-и, как свидетельствует r-tagged SO question list--другие, а также):

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

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

короткий ответ: дать пакет sos попробуйте, когда такие вопросы приходят вверх!--6-->

один из предыдущих ответов дал Косинус вместе со ссылкой на страницу справки. Вероятно, это именно то, чего хочет ОП. Когда вы смотрите на связанную страницу, вы видите, что эта функция находится в 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 вызов выше возвращает фрейм данных с девятью столбцами и результатами в виде строк -- rendered as 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:: dissimilarity ()


вы также можете проверить веганский пакет: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.


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

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)
}

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

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