找出两个数组之间的余弦相似度

时间:2010-03-29 00:44:57

标签: arrays r distance similarity cosine

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

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

7 个答案:

答案 0 :(得分:67)

这些问题一直存在(对我来说 - 并且由 r 标记的SO问题列表 - 其他人也证明):

是否存在一个函数,无论是在R核心还是在任何R包中,都可以执行x?,如果是,

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

简短回答:在出现这类问题时尝试 sos package

早期的答案之一给出了余弦以及指向其帮助页面的链接。这可能正是OP想要的。当您查看链接到页面时,您会看到此功能位于 lsa 包中。

如果您还不知道要查找哪个包,您会如何找到此功能?

您可以随时尝试标准的R帮助功能(下面的“>”只表示R命令行):

> ?<some_name>

> ??<some_name>

> *apropos*<some_name>

如果这些失败,那么安装&amp;加载 sos 包,然后

***findFn***

findFn 也别名为“???”,虽然我不经常使用它,因为我认为你不能传递函数名以外的参数

对于这里的问题,试试这个:

> library(sos)

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

传入的其他参数(“maxPages = 2”和“sortby =”MaxScore“)仅限制返回的结果数,并分别指定结果的排名方式 - 即”找到一个名为'余弦的函数'或者在函数描述中有'余弦'一词,只返回两页结果,并按降序相关分数排序“

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

扫描最后一列描述和链接,项目(行)21,您会发现:

余弦测量(矩阵)

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

使用 findFn ,你可以很快找到你想要的功能即使你不知道它在哪个包

答案 1 :(得分: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")

答案 2 :(得分:16)

接受Jonathan Chang的评论我写了这个函数来模仿dist。没有额外的包加载。

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

答案 3 :(得分:9)

答案 4 :(得分:5)

您还可以查看纯素包:http://cran.r-project.org/web/packages/vegan//index.html

此包中的函数vegdist具有各种不同(距离)函数,例如manhattaneuclideancanberrabraykulczynskijaccardgoweraltGowermorisitahornmountfordraupbinomial,{ {1}}或chao。请查看包装中的.pdf以获取定义,或参考参考文献https://stats.stackexchange.com/a/33001/12733

答案 5 :(得分: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是您的数据集。

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

答案 6 :(得分:0)

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

如果您有两个由特征的p维向量描述的对象, x1x2均为维度p,您可以通过cor(x1, x2)计算相关相似度。

请注意,在统计中,相关性用作比例矩概念,因此自然地将其视为随机变量之间的相关性。 cor(dataset)函数将计算数据矩阵各列之间的相关性。

在典型情况下,数据矩阵为X,行为单位(或对象),列为变量(或特征),则可以计算相关相似度矩阵< / strong>,只需在cor的转置上计算X,然后给结果对象一个dist

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

通过这种方式,您可以以相同的方式计算相关相异度矩阵。以下是关于角度大小和对象矢量之间的方向的区别

1 - cor(t(X))

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

1 - abs(cor(t(X)))