2つの配列間のコサイン類似性(またはコサイン距離)を見つけることができる組み込み関数がRにあるかどうか疑問に思いますか?
現在、独自の機能を実装していますが、Rにはすでに付属しているはずです。
これらの種類の質問は常に出てきます(私にとって- r -tagged SO question list--others同様に):
xを実行する関数がRコアまたは任意のRパッケージにありますか?その場合、
CRANの+2000 Rパッケージのどこにありますか?
短い答え: sos package これらの種類の質問が出てきたら、試してみてください
以前の回答の1つは、ヘルプページへのリンクとともに cosine を示しました。これはおそらく、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」という名前の関数を見つけるか、関数の説明に「コサイン」という用語があり、2ページの結果のみを返し、関連性スコアの降順で並べ替えます。
上記の findFn の呼び出しは、9列のデータフレームを返し、結果は行としてHTMLとしてレンダリングされます。
最後の列をスキャンすると、説明とリンク、アイテム(行)21が見つかります。
余弦メジャー(行列)
このテキストはリンクでもあります。それをクリックすると、その関数を含むパッケージ内のその関数のヘルプページに移動します。つまり、
--findFnを使用すると、必要な関数をすぐに見つけることができますたとえそれでもどのパッケージにあるかわかりません
いくつかのオプションがすでに利用可能になっているようですが、私が好きな慣用的な解決策を見つけたので、リストに追加したいと思いました。
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()
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
またはcao
。パッケージの.pdfで定義を確認するか、参考資料を参照してください https://stats.stackexchange.com/a/33001/127 。
内積行列がある場合、この関数を使用してコサイン類似度行列を計算できます。
_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
はデータセットです。
この関数は基本的に、ドット積をベクトルのノルムで除算することです。