8

11 次元の 2 つのベクトルがあります。

a <- c(-0.012813841, -0.024518383, -0.002765056,  0.079496744,  0.063928973,
        0.476156960,  0.122111977,  0.322930189,  0.400701256,  0.454048860,
        0.525526219)

b <- c(0.64175768,  0.54625694,  0.40728261,  0.24819750,  0.09406221, 
       0.16681692, -0.04211932, -0.07130129, -0.08182200, -0.08266852,
       -0.07215885)

cosine_sim <- cosine(a,b)

戻り値:

-0.05397935

パッケージcosine()から使用しました。lsa

いくつかの値について、与えられたもののように負の cosine_sim を取得しています。類似度がどのように負になるかはわかりません。0 から 1 の間である必要があります。

ここで何が起こっているのか誰でも説明できますか。

4

4 に答える 4

14

R の良いところは、多くの場合、関数を掘り下げて、何が起こっているかを自分で確認できることです。cosine(かっこや引数などなしで)入力すると、R は関数の本体を出力します。それを調べてみると (ある程度の練習が必要です)、行列の列の対ごとの類似性を計算するための機械がたくさんあることがわかります (つまり、ビットはif (is.matrix(x) && is.null(y))条件でラップされますが、関数の重要な行は次のとおりです。

crossprod(x, y)/sqrt(crossprod(x) * crossprod(y))

これを引き出して、あなたの例に適用しましょう:

> crossprod(a,b)/sqrt(crossprod(a)*crossprod(b))
            [,1]
[1,] -0.05397935
> crossprod(a)
     [,1]
[1,]    1
> crossprod(b)
     [,1]
[1,]    1

つまり、既に正規化されたベクトルを使用しているので、確認するだけですcrossprod。あなたの場合、これは

> sum(a*b)
[1] -0.05397935

(実際の行列演算の場合crossprod、同等の演算を手動で構築するよりもはるかに効率的です)。

@Jack Maneyの答えが言うように、2つのベクトルの内積(長さ(a)*長さ(b)*cos(a、b))は負になる可能性があります...

価値があるのは、のcosine関数がlsa行列引数に対してより簡単/効率的に実装される可能性があることas.dist(crossprod(x))です...

編集:以下の削除された回答へのコメントで、[0,1]の類似度測定が必要な場合、余弦距離測定の2乗が適切である可能性があることを提案しました-これは、決定係数を使用することに類似しています相関係数 (r) ではなく (r^2) -- しかし、使用する類似性尺度の目的/意味について、前に戻ってより慎重に考える価値があるかもしれません ...

于 2011-07-06T13:36:35.090 に答える
2

cosine関数は戻ります

crossprod(a, b)/sqrt(crossprod(a) * crossprod(b))

この場合、分母の両方の項は 1 ですが、crossprod(a, b)-0.05 です。

于 2011-07-06T13:46:43.300 に答える
1

余弦関数は負の値を取ることができます。

于 2011-07-06T13:31:48.077 に答える
0

2 つのベクトルのコサインは -1 から +1 の間の任意の値を取ることができますが、コサインの類似性(指標の検索で) は [0,1] 間隔から値を取るために使用されていました。理由は簡単です。WordxDocument マトリックスには負の値がないため、2 つのベクトルの最大角度は 90 度で、コサインは 0 です。

于 2017-01-13T13:27:45.930 に答える