2 つの配列間のコサイン類似度 (またはコサイン距離) を見つけることができる組み込み関数が R にあるかどうか疑問に思っていますか?
現在、私は独自の機能を実装していますが、Rにはすでに機能があるはずだと思わずにはいられません。
2 つの配列間のコサイン類似度 (またはコサイン距離) を見つけることができる組み込み関数が R にあるかどうか疑問に思っていますか?
現在、私は独自の機能を実装していますが、Rにはすでに機能があるはずだと思わずにはいられません。
これらの種類の質問は常に出てきます(私にとっては-そしてrタグ付きのSO質問リストからも明らかなように-他の人も同様です):
Rコアまたは任意のRパッケージのいずれかに、xを実行する関数はありますか?そしてそうならば、
CRANの+2000Rパッケージのどこにありますか?
簡単な答え:この種の質問が出てきたら、 sosパッケージを試してみてください
以前の回答の1つは、ヘルプページへのリンクとともにコサインを提供しました。これはおそらくまさに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)))))
}
ビーガン パッケージも確認できます: http://cran.r-project.org/web/packages/vegan//index.html
このパッケージの関数 vegdist には、 、 、 、 、 、 、 、 、 、 、などのさまざまな非類似度(距離manhattan
)関数があります。パッケージ内の .pdf で定義を確認するか、参考文献https://stats.stackexchange.com/a/33001/12733を参照してください。euclidean
canberra
bray
kulczynski
jaccard
gower
altGower
morisita
horn
mountford
raup
binomial
chao
cao
内積行列がある場合、この関数を使用してコサイン類似度行列を計算できます。
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
ですか。
この関数は基本的に内積をベクトルのノルムで除算することです。