2つのベクトルがあるとします。それらを比較するためにどのアルゴリズムを使用できますか?

StackOverflow https://stackoverflow.com/questions/1805987

  •  05-07-2019
  •  | 
  •  

質問

会社1には次のベクターがあります:

['books','video','photography','food','toothpaste','burgers'] ... ...

Company 2には次のベクターがあります:

['video','processor','photography','LCD','power supply', 'books'] ... ...

これが度数分布であると仮定します(タプルにできますが、入力するには多すぎます)。
ご覧のように...これらのベクトルには重複するものがあります。 "ビデオ"および「写真」 「似ている」ように見える2つのベクトルが同じ位置にあるためです。そして...「本」明らかに会社1の強みです。 これは頻度分布であるため、順序と位置は重要です。

これを試すのに使用できるアルゴリズムは何ですか?これらのベクトルを使用して、これらの企業に貴重なデータを提供できるアルゴリズムを使用できますか?

テキストマイニングと情報検索は初めてです。誰かがこの質問に関連してこれらのトピックについて私を案内してもらえますか?

役に立ちましたか?

解決

位置は非常に重要であり、強調するように、重要なメトリックは異なるベクトル内の同じアイテム間の位置の差に基づきます(たとえば、差の絶対値を合計したり、正方形)。解決する必要がある大きな問題は、1つのベクトルに存在するアイテム(N番目のアイテム)の重量を量り、もう1つのベクトルに完全に存在しないことです。それは、たとえば、実際のアイテムの直後に欠落しているアイテムが実際に存在しているかのように、比較的小さな問題なのか、それとも本当に大きな問題なのか?実際のアプリケーション領域をさらに理解しなければ、それを言うことは不可能です。この問題に対処するためのさまざまな方法を試して、関心のある事例でどのような結果が得られるかを確認してください!

たとえば、「欠落しているアイテムが、実際のアイテムの直後に存在する場合とほぼ同じである」と仮定します。次に、各入力ベクトルを前処理して、位置に合わせて辞書マッピングアイテムにします(入力ベクトルの多くのペアを比較する必要がある場合、重要な最適化!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

そして、そのような2つの辞書を比較するには:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(または、最後のステートメントの二乗の代わりにabs(d))。不足しているアイテムの重量を増やすには(ディクテーション、つまりベクトルをさらに遠ざける)、同様の構造のプログラムで、長さだけでなく、長さを2倍にするか、100などの大きな定数を使用することができます。

他のヒント

Collective Intelligenceのプログラミングという本をお勧めします。
非常に素晴らしい本ですこのような単純なデータから情報を取得する方法について。含まれているコード例があります(Pythonで:)

編集: gbjbaanbに返信するだけです:これはPythonです!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

ハミング距離

をご覧ください

mbgが述べたように、ハミング距離は良い出発点です。基本的に、会社の価値に含まれているかどうかにかかわらず、すべての可能なアイテムにビットマスクを割り当てます。

たとえば歯磨き粉はA社では1、B社では0です。次に、会社間で異なるビットを数えます。ジャカード係数はこれに関連しています。

ハミング距離は、実際には「ビデオ」のようなものの間の類似性をキャプチャできません。および「写真」。明らかに、一方を販売する会社は、歯磨き粉を販売する会社よりも高い確率で他方を販売します。

このために、LSI(次元削減にも使用されます)や階乗コード(制限付きボルツマンマシン、オートエンコーダー、予測可能性最小化などのニューラルネットワークなど)を使用して、よりコンパクトな表現を取得し、それを使用して比較できますユークリッド距離。

各エントリのランクを選択し(ランクが高いほど良い)、マッチ間の幾何平均の合計を作成します

2つのベクトルの場合

sum(sqrt(vector_multiply(x,y)))  //multiply matches

ベクトル上の各値のランクの合計は、各ベクトルで同じである必要があります(以前は1) そうすれば、3つ以上のベクトルを比較できます。

ikkebrの方法を適用すると、aがbに似ていることがわかります

その場合は単に使用する

sum( b( b.intersection(a) ))

set_intersection アルゴリズムを使用できます。 2つのベクトルを最初に並べ替え(並べ替え呼び出しを使用)、次に4つの反復子を渡すと、共通要素が挿入されたコレクションが返されます。同様に動作する他のいくつかがあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top