2010-03-29 208 views
18

我想知道在R中是否有內置函數可以找到兩個數組之間的餘弦相似度(或餘弦距離)?查找兩個數組之間的餘弦相似度

目前,我實現了自己的功能,但我不禁想到R應該已經有了一個。

+26

R是否真的需要一個新的函數來處理'x%*%y/sqrt(x%*%x * y%*%y)'? – 2010-03-29 03:11:35

+1

這篇文章演示瞭如何創建一個共生矩陣,然後計算餘弦相似度 - http://stackoverflow.com/a/24627329/168689 – Rob 2015-01-27 16:01:26

+0

也檢查出https://stackoverflow.com/questions/8158867/most-efficient- r餘弦計算 – 2017-09-23 09:16:22

回答

59

這些排序的問題,拿出所有的時間(我 - 由[R證明SO - 標記的問題列表 - 其他人也):

是否有一個函數,無論是在R核心還是在任何R軟件包中,x?如果是這樣,

我在哪裏可以找到CRAN中的+2000 R軟件包?

答案很簡單:給SOS包一試時,這些類型的問題拿出

一個較早的答案給了餘弦一個鏈接到它的幫助頁面一起。這可能正是OP想要的。當您查看鏈接頁面時,您會看到該函數位於lsa包中。

但是如果您不知道要在哪個包中查找它,您將如何找到此函數?

,你還可以嘗試使用標準的R幫助功能( 「>」 的只是意味着R命令行):

> ?<some_name> 

> ??<some_name> 

> *apropos*<some_name> 

如果失敗,然後安裝&負荷SOS包,然後

***findFn*** 

findFn也別名爲 「???」,你GH我不經常使用,因爲我不認爲你可以在比函數名

的問題在這裏的其他參數傳遞,試試這個:

> library(sos) 

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

傳遞的附加參數(」 maxPages = 2「和」sortby =「MaxScore」)只是限制返回結果的數量,並分別指定結果的排列方式 - 即「找到名爲'餘弦'的函數或者'餘弦'功能描述,只返回兩頁結果,並按降序排列相關得分「

findFn上面的調用返回一個包含九列的數據框,並將結果顯示爲行 - 呈現爲HTML。

掃描的最後一列,介紹和鏈接,項目(行)21你會發現:

餘弦辦法(矩陣)

這段文字也是一個鏈接;點擊它需要你在其中包含功能包該功能的幫助頁面 - 使用findFn換句話說

,你可以很快找到你想要的即使你沒有的功能想法是在

+0

感謝您的信息。它可能會在未來解決很多我的問題! – defoo 2010-03-31 06:21:37

+5

+100 @doug不是一個douchebag和回答一個偉大的答案,這是一個教學工具!要成爲! – 2015-11-19 13:23:31

11

從Jonathan Chang發表評論我寫了這個函數來模仿dist。沒有額外的軟件包加載。

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

你爲什麼要做1- x * t(x)/(...)?是相異性而不是相似性的價值? – alily 2016-10-28 14:47:03

+1

@alily餘弦公式給出了相似性。如果矢量指向相同的方向,則爲1。當向量相同時距離度量值需要爲0,因此1-相似度=距離。許多用途需要距離而不是相似性(例如'hclust')。添加'as.dist'將矩陣格式化爲一個很好的R距離(基本上是一個三角矩陣)。希望有所幫助。 – pbible 2016-10-30 07:29:59

16

它看起來像幾個選項都已經上市,但我只是碰到一個地道的解決方案,我喜歡,所以我想我應該把它添加到列表中跌跌撞撞。

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") 
+0

是的我以前不知道代理套餐,但我不認爲這是必要的套餐... – 2015-07-07 08:28:22

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是您的數據集。

該功能基本上是將點積乘以向量的範數。