1

私のツリーの構造は単純で、深さは2であり、各子ノードはルートの直接の子であり、各ノードにはルートを除く重みがあります。2本の木の類似性を測定する良い方法はありますか?
元の質問は次のとおり
です。読んだ本に関するデータリストがあるとします。リストには、ハッシュテーブルのようなキーと値が含まれています。キーは本のカテゴリであり、値は現在のカテゴリで読んだ本の量です。したがって、すべての人がこのデータリストを持っているので、このデータリストに基づいて2人のユーザーの類似性を比較したいと思います。私はコラボレーティブフィルタリングがこれを行うことができることを知っていますが、私はこの方法を試し、それをcfと比較しています。
したがって、データリストを加重ツリーとして扱います。カテゴリは子ノードであり、各子ノードの重みは、このカテゴリがユーザーの本に表示される回数です。
類似性は、共同フィルタリングにおける2人のユーザーの類似性と類似しています。それは数です。

4

1 に答える 1

3

これは、セット操作を使用して実行できます。

私はかつて、数年前にMeta-CVSソフトウェアにそのような類似性メトリックを実装しました。これは、スナップショットをブランチにインポートするときに名前が変更されたファイルを識別するために使用されました。もちろん、ベースライン間でファイルの名前を変更したり編集したりすることはできます。つまり、正確な比較を行うことはできません。しかし、私は逸脱します。

ジャッカード係数1

まず第一に、2人のユーザーは本に対してまったく異なる興味を持つことができます。または、彼らは完全に同じ興味を持つことができます。

あなたができることは、それらを組み合わせた関心のセットのサイズを計算し、それらが共通して持つその部分を全体のサイズの一部として表すことです。

インタレストセットが重み付けされておらず、関連付けられた重み付けなしでカテゴリを設定していると仮定します。類似性は、2人のユーザーが共通して持つカテゴリの数を、カテゴリの総数で割ったものとして表すことができます。つまり、集合の交差のカーディナリティーを集合の和集合のカーディナリティーで割ったものです。

ウェイトが関係している場合は、何らかの方法でウェイトを処理する必要があります。おそらく、集合の総重量をユニオンの総重量で計算します(ゼロ除算に注意してください)。

ご覧のとおり、このメトリックは、ユーザーに共通のカテゴリがない場合は0.0、(重みに関係なく)カテゴリの一致に関心がある場合は1.0になるため、実行可能です。

コサイン類似性2

類似性を定義する別の方法は、これをベクトル内積(相関)として扱うことです。まず、2人のユーザーの間に存在するすべてのカテゴリを決定します。2人のユーザーのそれぞれについて、すべてのカテゴリの重みが存在するベクトルを作成します(ユーザーが関心セットにそのカテゴリを持っていない場合は、ゼロとして)。

次に、これらのベクトルの内積を取り、それを長さの積で割ることにより、類似性を計算できます。(A。B)/ | A || B |

ベクトルの長さは、重みの2乗の合計の平方根です。(繰り返しますが、ゼロ除算に注意してください。)

この類似性メトリックでは、ユーザーに共通のカテゴリがない場合、2つのベクトルは垂直であり、それらの内積はゼロです。このメトリックは、基本的に2つのベクトル間の角度の正弦です。正弦が1に近いほど、ベクトルは平行になります(ユーザーの関心は「同じ方向に整列」します)。

これがあなたにいくつかのアイデアを与えることを願っています。ご覧のとおり、これは制限がありません。

于 2012-05-12T02:00:55.077 に答える