40

私は分類されたテキストのコーパスを持っています。これらからベクトルを作成します。各ベクトルは 1 つのドキュメントに対応します。ベクトル コンポーネントは、TFIDF 値として計算されるこのドキュメントの単語の重みです。次に、すべてのクラスが 1 つのベクトルで表されるモデルを作成します。モデルには、コーパス内のクラスと同じ数のベクトルがあります。モデル ベクトルのコンポーネントは、このクラスのベクトルから取得したすべてのコンポーネント値の平均として計算されます。分類されていないベクトルについては、これらのベクトル間のコサインを計算することにより、モデル ベクトルとの類似性を判断します。

質問:

1) 分類されていないベクトルとモデル ベクトルの間のユークリッド距離を使用して類似度を計算できますか?

2) 2 つのベクトル間の角度のコサインの代わりにユークリッド距離を類似度の尺度として使用できないのはなぜですか。

ありがとう!

4

4 に答える 4

40

これを考える非公式ながら直感的な方法の 1 つは、ベクトルの 2 つの成分である方向大きさを考慮することです。

方向はベクトルの「好み」/「スタイル」/「感情」/「潜在変数」であり、大きさはその方向に向かってどれだけ強いかです。

ドキュメントを分類するときは、全体的な感情によって分類したいので、角度距離を使用します。

ユークリッド距離は、ドキュメントが方向ではなく L2 ノルム (2 次元の場合は大きさ) によってクラスター化される可能性があります。つまり、原点からの距離が類似しているため、まったく異なる方向のベクトルがクラスター化されます。

于 2014-01-27T12:57:53.427 に答える
23

質問には逆順でお答えします。2 番目の質問については、コサイン類似度とユークリッド距離は、ベクトルの類似度を測定する 2 つの異なる方法です。前者は原点に対するベクトルの類似性を測定し、後者はベクトルに沿った特定の関心点間の距離を測定します。単独で使用するか、それらを組み合わせて両方を使用するか、他の多くの方法のいずれかを調べて類似性を判断できます。詳細については、Michael Collins の講義のスライドを参照してください

最初の質問はあまり明確ではありませんが、ドキュメントを比較しているか、「モデル」を比較しているかに関係なく、いずれかの測定値を使用して 2 つのベクトル間の距離を見つけることができるはずです (これは、より伝統的にクラスターとして記述されます。モデルはすべてのクラスターの合計です)。

于 2014-01-03T18:16:33.980 に答える
5

計算時間 ( python):

import time
import numpy as np

for i in range(10):
    start = time.time() 
    for i in range(10000):
        a, b = np.random.rand(100), np.random.rand(100) 
        np.dot(a, b) / ( np.linalg.norm(a) * np.linalg.norm(b))
    print 'Cosine similarity took', time.time() - start

    start = time.time() 
    for i in range(10000):
        a, b = np.random.rand(100), np.random.rand(100) 
        2 * (1 - np.dot(a, b) / ( np.linalg.norm(a) * np.linalg.norm(b)))
    print 'Euclidean from 2*(1 - cosine_similarity) took', time.time() - start


    start = time.time() 
    for i in range(10000):
        a, b = np.random.rand(100), np.random.rand(100) 
        np.linalg.norm(a-b)
    print 'Euclidean Distance using np.linalg.norm() took', time.time() - start


    start = time.time() 
    for i in range(10000):
        a, b = np.random.rand(100), np.random.rand(100) 
        np.sqrt(np.sum((a-b)**2))
    print 'Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took', time.time() - start
    print '--------------------------------------------------------'

[アウト]:

Cosine similarity took 0.15826010704
Euclidean from 2*(1 - cosine_similarity) took 0.179041862488
Euclidean Distance using np.linalg.norm() took 0.10684299469
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.113723039627
--------------------------------------------------------
Cosine similarity took 0.161732912064
Euclidean from 2*(1 - cosine_similarity) took 0.178358793259
Euclidean Distance using np.linalg.norm() took 0.107393980026
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111194849014
--------------------------------------------------------
Cosine similarity took 0.16274189949
Euclidean from 2*(1 - cosine_similarity) took 0.178978919983
Euclidean Distance using np.linalg.norm() took 0.106336116791
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111373186111
--------------------------------------------------------
Cosine similarity took 0.161939144135
Euclidean from 2*(1 - cosine_similarity) took 0.177414178848
Euclidean Distance using np.linalg.norm() took 0.106301784515
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.11181807518
--------------------------------------------------------
Cosine similarity took 0.162333965302
Euclidean from 2*(1 - cosine_similarity) took 0.177582979202
Euclidean Distance using np.linalg.norm() took 0.105742931366
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111120939255
--------------------------------------------------------
Cosine similarity took 0.16153883934
Euclidean from 2*(1 - cosine_similarity) took 0.176836967468
Euclidean Distance using np.linalg.norm() took 0.106392860413
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.110891103745
--------------------------------------------------------
Cosine similarity took 0.16018986702
Euclidean from 2*(1 - cosine_similarity) took 0.177738189697
Euclidean Distance using np.linalg.norm() took 0.105060100555
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.110497951508
--------------------------------------------------------
Cosine similarity took 0.159607887268
Euclidean from 2*(1 - cosine_similarity) took 0.178565979004
Euclidean Distance using np.linalg.norm() took 0.106383085251
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.11084485054
--------------------------------------------------------
Cosine similarity took 0.161075115204
Euclidean from 2*(1 - cosine_similarity) took 0.177822828293
Euclidean Distance using np.linalg.norm() took 0.106630086899
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.110257148743
--------------------------------------------------------
Cosine similarity took 0.161051988602
Euclidean from 2*(1 - cosine_similarity) took 0.181928873062
Euclidean Distance using np.linalg.norm() took 0.106360197067
Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111301898956
--------------------------------------------------------
于 2016-04-05T09:49:01.017 に答える
0

特定のアプリケーションでどちらの距離測定が優れているかを判断する唯一の確実な方法は、両方を試して、どちらがより満足のいく結果をもたらすかを確認することです. ほとんどの場合、有効性の違いは大きくないと思いますが、特定のアプリケーションではそうではないかもしれません.

于 2019-01-03T06:13:37.380 に答える