我想知道R中是否有一个内置函数可以找到两个数组之间的余弦相似度(或余弦距离)?
目前,我实现了自己的功能,但我不禁认为 R 应该已经自带了。
我想知道R中是否有一个内置函数可以找到两个数组之间的余弦相似度(或余弦距离)?
目前,我实现了自己的功能,但我不禁认为 R 应该已经自带了。
这类问题一直出现(对我来说——正如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 中,您也可以很快找到您想要的功能
看起来已经有一些选项可用,但我只是偶然发现了一个我喜欢的惯用解决方案,所以我想我会把它添加到列表中。
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")
从 Jonathan Chang 那里得到评论,我写了这个函数来模仿 dist。无需加载额外的包。
cosineDist <- function(x){
as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2)))))
}
您还可以查看 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
or 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)
}
输入 S 是点积矩阵。简单地说,你的数据集S = dt %*% t(dt)
在哪里dt
。
该功能基本上是将点积除以向量的范数。
余弦相似度不是不变的。相关相似性可能是一个更好的选择,因为它解决了这个问题并且它还与平方欧几里得距离有关(如果数据是标准化的)
如果您有两个由特征的 p 维向量描述的对象,
x1
并且x2
两个维度都是p
,则可以通过 计算相关相似度cor(x1, x2)
。
请注意,在统计学中,相关性被用作缩放矩的概念,因此它自然被认为是随机变量之间的相关性。该cor(dataset)
函数将计算数据矩阵列之间的相关性。
在具有 (nxp) 数据矩阵 的典型情况下,X
其行上有单位(或对象),其列上有变量(或特征),您可以简单地通过计算的转置来计算相关相似度矩阵,并给出结果反对一个类cor
X
dist
as.distance(cor(t(X)))
顺便说一句,您可以以相同的方式计算相关相异矩阵。下面对物体向量之间的角度大小和方向进行区分
1 - cor(t(X))
这个不关心方向,只关心角度的大小
1 - abs(cor(t(X)))