查找两个数组之间的余弦相似度
我想知道在R中是否有内置函数可以find两个数组之间的余弦相似度(或余弦距离)?
目前,我执行了自己的function,但是我不禁想到R应该已经有了一个。
这样的问题一直出现(对我来说,正如问题列表中的问题清单所certificate的那样):
有没有一个函数,无论是在R核心或在任何R包,那x? 如果是的话,
我在哪里可以findCRAN中的+2000 R软件包?
简短的回答:当这些问题出现时,给sos包一个尝试
其中一个较早的答案给出了余弦以及其帮助页面的链接。 这可能正是OP想要的。 当你看链接页面时,你会发现这个函数在lsa包中。
但是如果你不知道在哪个Package中find它,你将如何find这个函数呢?
您可以随时尝试标准的R帮助function(下面的“>”只是指R命令行):
> ?<some_name> > ??<some_name> > *apropos*<some_name>
如果这些失败,然后安装和加载sos软件包
***findFn***
findFn也是“???”的别名,虽然我不经常使用它,因为我不认为你可以传入函数名以外的参数
对于这里的问题,试试这个:
> library(sos) > findFn("cosine", maxPages=2, sortby="MaxScore")
通过(“maxPages = 2”和“sortby =”MaxScore“)传递的附加参数只是限制返回结果的数量,并且分别指定结果的排列方式 – 即”find一个名为“cosine”的函数,或者在函数描述中有“余弦”一词,只返回两页结果,并按降序相关性得分sorting“
上面的findFn调用返回一个数据框,其中有九列,结果是行 – 呈现为HTML。
扫描最后一列, 描述和链接 ,find项目(行)21:
余弦测量(matrix)
这个文本也是一个链接; 点击它就可以进入包含该function的Package中该function的帮助页面 – 换句话说
使用findFn ,你可以很快find你想要的function, 即使你不知道它在哪个包中
看起来有几个选项已经可用了,但我偶然发现了一个我喜欢的习惯解决scheme,所以我想我会把它添加到列表中。
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))))) }
检查这些函数lsa :: cosine() , clv :: dot_product()和arules :: dissimilarity()
你也可以检查纯素食包: http : //cran.r-project.org/web/packages/vegan//index.html
在这个包装中的functionvegdist有manhattan
, kulczynski
, jaccard
, altGower
, morisita
, altGower
, morisita
, altGower
, morisita
, horn
, mountford
, raup
, binomial
, chao
或cao
等各种不同的(距离)function。 请查看软件包中的.pdf以获得定义,或者查阅参考资料https://stats.stackexchange.com/a/33001/12733 。
如果你有一个点积matrix,你可以使用这个函数来计算余弦相似度matrix:
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) }
inputS是点积的matrix。 简而言之, S = dt %*% t(dt)
,其中dt
是您的数据集。
这个函数基本上是用向量的规范来划分点积。