我想知道R中是否有内置函数可以找到两个数组之间的余弦相似度(或余弦距离)?
目前,我实现了自己的功能,但我不禁认为R应该已经配备了一个。
答案 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具有各种不同(距离)函数,例如manhattan
,euclidean
,canberra
,bray
,kulczynski
,jaccard
,gower
,altGower
,morisita
,horn
,mountford
,raup
,binomial
,{ {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维向量描述的对象,
x1
和x2
均为维度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)))