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

def*_*foo 25 arrays trigonometry r distance similarity

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

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

dou*_*oug 67

这些问题一直存在(对我而言 - 正如r标签的SO问题清单所证明的那样 - 其他问题也是如此):

有没有一个函数,无论是在R核心还是在任何R包中,都有x?如果是这样,

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

简短的回答:当出现这些问题时,试试sos包

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

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

你可以随时尝试标准的R帮助功能(下面的">"只是指R命令行):

> ?<some_name>

> ??<some_name>

> *apropos*<some_name>
Run Code Online (Sandbox Code Playgroud)

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

***findFn***
Run Code Online (Sandbox Code Playgroud)

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

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

> library(sos)

> findFn("cosine", maxPages=2, sortby="MaxScore")
Run Code Online (Sandbox Code Playgroud)

传入的附加参数("maxPages = 2"和"sortby ="MaxScore")仅限制返回的结果数量,并分别指定结果的排名方式 - 即"找到名为'余弦'的函数或者在函数描述中使用术语"余弦",只返回两页结果,并通过降低相关性得分对它们进行排序"

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

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

余弦测量(矩阵)

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

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


Dav*_*arx 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")
Run Code Online (Sandbox Code Playgroud)


pbi*_*ble 16

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

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

  • @alily余弦公式给出了相似性.如果向量指向相同方向,则为1.当向量相同时,距离度量需要值为0,因此1 - 相似度=距离.许多用途需要距离而不是相似性(例如"hclust").添加`as.dist`将矩阵格式化为漂亮的R距离(基本上是三角矩阵).希望有所帮助. (2认同)

use*_*731 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,chaocao.请查看包中的.pdf以获取定义或参考参考https://stats.stackexchange.com/a/33001/12733.