余弦の非類似度行列を計算するR関数はありますか?[閉まっている]


20

コサイン距離に基づく行クラスタリングを使用してヒートマップを作成したいと思います。私はRを使用heatmap.2()して図を作成しています。私はそこだと見ることができdist、パラメータは、heatmap.2私はコサイン非類似度行列を生成する機能を見つけることができません。組み込みのdist機能は、コサイン距離をサポートしていない、私はとも呼ばれるパッケージたarulesdissimilarity()機能をそれだけで、バイナリデータで動作します。


5
独自のコサイン非類似度関数を記述する方が高速な場合があります。
想定

2
コサインは類似性であり、非類似性ではありません。ただし、コサインをスケーリングされたデータのユークリッド距離に変換できます:d = sqrt(2 *(1-cos))。
ttnphns

回答:


29

@Maxがコメント(+1)で示したように、他の場所で探すのに時間を費やすよりも、「自分で書く」方が簡単です。知っているように、長さ 2つのベクトル間のコサイン類似度ABn

C==1nAB=1nA2=1nB2

で生成するのは簡単Rです。Let Xは、行が類似性を計算する値である行列です。次に、次のRコードを使用して類似度マトリックスを計算できます。

cos.sim <- function(ix) 
{
    A = X[ix[1],]
    B = X[ix[2],]
    return( sum(A*B)/sqrt(sum(A^2)*sum(B^2)) )
}   
n <- nrow(X) 
cmb <- expand.grid(i=1:n, j=1:n) 
C <- matrix(apply(cmb,1,cos.sim),n,n)

マトリックスCはコサイン類似度マトリックスであり、任意のヒートマップ関数に渡すことができます(私がよく知っているのはimage())だけです。


おかげで、これは役に立ちます。実際には、マトリックス自体をプロットするのではなく、自分が持っている別のヒートマップのクラスター化のための距離関数が必要です。
グレッグドロドコヴィッツ

@ GregSlodkowicz、OKおそらく、このマトリックスを使用している関数に渡すことができます。また、この回答が役立った場合は、賛成票を検討してください(または決定的と思われる場合は回答を受け入れてください):)
マクロ

返信、ttnphnsのコメントのおかげで、私は自分のやりたいことができました。今、私は列をクラスタリングするときよりも、行をクラスタ化するときに、異なるメトリックを持っていると思いますが、それを押し多分それの...
グレッグSlodkowicz

どうやらコメントするのに十分なポイントがありません。マクロのすてきな答えを少し修正したバージョンを提供したかっただけです。ここにあります。#マクロによるChirazBのcos.sim()バージョン#where S = X%*%t(X)cos.sim.2 <-function(S、ix){i <-ix [1] j <-ix [2 ] return(S [i、j] / sqrt(S [i、i] * S [j、j]))} #test X <-matrix(rnorm(20)、nrow = 5、ncol = 4)S < -X%*%t(X)n <-nrow(X)idx.arr <-expand.grid(i = 1:n、j = 1:n)C <-matrix(apply(idx.arr、1、 cos.sim、X)、n、n)C2 <-matrix(apply(idx.arr、1、cos.sim.2、S)、n、n)グローバル変数が好きではないので、Sを含めた理由パラメータとして。
シラーズベンアブデルカデル

6

cosinelsaパッケージの関数を使用できます:http ://cran.r-project.org/web/packages/lsa


4

次の関数は、1-dベクトルの代わりに行列を操作する場合に便利です。

# input: row matrices 'ma' and 'mb' (with compatible dimensions)
# output: cosine similarity matrix

cos.sim=function(ma, mb){
  mat=tcrossprod(ma, mb)
  t1=sqrt(apply(ma, 1, crossprod))
  t2=sqrt(apply(mb, 1, crossprod))
  mat / outer(t1,t2)
}

4

上記のいくつかの答えは計算効率が悪いので、これを試してください。


コサイン類似度行列の場合

Matrix <- as.matrix(DF)
sim <- Matrix / sqrt(rowSums(Matrix * Matrix))
sim <- sim %*% t(sim)

余弦の非類似度行列(距離行列)に変換します。

D_sim <- as.dist(1 - sim)

0

この問題に関する以前のコードの一部(@Macroから)を増やして、次のようにクリーンなバージョンにまとめることができます。

df <- data.frame(t(data.frame(c1=rnorm(100),
                              c2=rnorm(100),
                              c3=rnorm(100),
                              c4=rnorm(100),
                              c5=rnorm(100),
                              c6=rnorm(100))))

#df[df > 0] <- 1
#df[df <= 0] <- 0



apply_cosine_similarity <- function(df){
  cos.sim <- function(df, ix) 
  {
    A = df[ix[1],]
    B = df[ix[2],]
    return( sum(A*B)/sqrt(sum(A^2)*sum(B^2)) )
  }   
  n <- nrow(df) 
  cmb <- expand.grid(i=1:n, j=1:n) 
  C <- matrix(apply(cmb,1,function(cmb){ cos.sim(df, cmb) }),n,n)
  C
}
apply_cosine_similarity(df)

お役に立てれば!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.