28

我想知道R中是否有一个内置函数可以找到两个数组之间的余弦相似度(或余弦距离)?

目前,我实现了自己的功能,但我不禁认为 R 应该已经自带了。

4

7 回答 7

70

这类问题一直出现(对我来说——正如r标记的 SO 问题列表所证明的那样——其他人也是如此):

在 R 核心或任何 R 包中是否有一个函数可以执行 x?如果是这样,

在 CRAN 的 +2000 R 包中,我在哪里可以找到它?

简短的回答:当这些问题出现时,试试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") 只是限制了返回的结果数量,并分别指定了结果的排名方式——即,“找到一个名为 'cosine' 的函数或函数描述中有‘余弦’一词,只返回两页结果,并按相关性分数降序排列”

上面的findFn调用返回一个包含九列的数据框,结果为行——呈现为 HTML。

扫描最后一列Description 和 Link项目(行)21,您会发现:

余弦测量(矩阵)

该文本也是一个链接;单击它会将您带到包含该功能的包中该功能的帮助页面 - 换句话说

使用findFn ,即使您不知道它在哪个 Package 中,您也可以很快找到您想要的功能

于 2010-03-29T18:05:32.197 回答
22

看起来已经有一些选项可用,但我只是偶然发现了一个我喜欢的惯用解决方案,所以我想我会把它添加到列表中。

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")
于 2014-01-09T05:33:17.743 回答
16

从 Jonathan Chang 那里得到评论,我写了这个函数来模仿 dist。无需加载额外的包。

cosineDist <- function(x){
  as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) 
}
于 2013-10-23T19:32:07.027 回答
9

检查这些函数lsa::cosine()clv::dot_product()arules::dissimilarity()

于 2010-03-29T06:36:00.437 回答
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, chaoor cao。请检查包中的 .pdf 以获取定义或参考参考资料https://stats.stackexchange.com/a/33001/12733

于 2012-07-25T15:51:58.463 回答
0

如果你有一个点积矩阵,你可以使用这个函数来计算余弦相似度矩阵:

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

该功能基本上是将点积除以向量的范数。

于 2016-03-31T14:54:16.537 回答
-1

余弦相似度不是不变的。相关相似性可能是一个更好的选择,因为它解决了这个问题并且它还与平方欧几里得距离有关(如果数据是标准化的)

如果您有两个由特征的 p 维向量描述的对象, x1并且x2两个维度都是p,则可以通过 计算相关相似度cor(x1, x2)

请注意,在统计学中,相关性被用作缩放矩的概念,因此它自然被认为是随机变量之间的相关性。该cor(dataset)函数将计算数据矩阵列之间的相关性。

在具有 (nxp) 数据矩阵 的典型情况下,X其行上有单位(或对象),其列上有变量(或特征),您可以简单地通过计算的转置来计算相关相似度矩阵,并给出结果反对一个类corXdist

as.distance(cor(t(X)))

顺便说一句,您可以以相同的方式计算相关相异矩阵。下面对物体向量之间的角度大小和方向进行区分

1 - cor(t(X))

这个不关心方向,只关心角度的大小

1 - abs(cor(t(X)))
于 2020-12-03T17:53:07.277 回答