問題タブ [cosine-similarity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - 選択された距離属性によってユーザー間の類似性を加重するためのアルゴリズム/実装はどれですか?
データ構造:
例/コンテキスト:
スタック交換では、交換サイトごとに異なるため、1 人のユーザーに対して多くのプロファイルを持つことができると思いますか? この問題では:
- プロファイル: ビデオ。したがって、ビデオ プロファイルにはビデオ カテゴリの属性のみが含まれます。
- 属性。ビデオ カテゴリの属性はジャンルである可能性があります。
- 属性値 (コメディ、アクション、スリラーなど) はすべて属性値です。
プロファイルと属性は、属性値を 2 つのレベルでグループ化する方法にすぎません。グループ化 (これは 2. 以降の重み付けに必要です) がなければ、関係は単なる User hasMany Attribute Values になります。
問題:
各ユーザーに、他の各ユーザーに対する類似性評価を与えます。
- ユーザーに関連付けられ
たすべての属性値に基づく類似性。
- フラット/ワンレベル
- 2 人のユーザー間で属性値の数が等しくない
- 属性値はユーザーごとに 1 回しか選択できないため、重複はありません
- したがって、コサイン類似度を持つバイナリ文字列/ブール配列?
- 1 + 体重プロファイル
- 各プロファイルに重みを付けます (合計 1?)
- プロファイルの類似性を計算し、重みを掛けて合計しますか?
- 1 + 重み属性のカテゴリとプロファイル
- 属性はカテゴリに属しているため、カテゴリに重みを付けることができます
- カテゴリごとの類似性、加重合計、プロファイルごとの類似性?
- または、プロファイルとカテゴリの重みをマージします
- 3 +すべての属性値
間の距離
- すべての可能な値と値の類似距離の表
- 値による類似性ではなく === 値
- 「近い」属性は、全体的な類似性に貢献します。
- これを行う方法がわからない
派手なコードや便利な機能は素晴らしいですが、これらのタスクを達成する方法を完全に理解したいと思っているので、一般的な疑似コードが最適だと思います。
ありがとう!
python - 2 つの行列のコサイン類似度を計算する
次のような2 つの行列を定義しました。
ここで、これら 2 つの行列の余弦類似度を計算したいと思います。次のコードの何が問題になっていますか。それは私にエラーを与えますobjects are not aligned
python - コサイン類似度 [Python]
データを使用したクエリのコサイン類似度を計算する関数の次のコードを使用します。
私は次の理論を持っています:
それで、私のコードを手伝ってもらえますか? 間違った値を返しますが、その理由がわかりません。ありがとう。
doc 56 スコアの結果:
algorithm - 異なるベクトル空間でコサイン類似度スコアの良さを測定するにはどうすればよいですか?
私は統計的手段を必要とする問題に取り組んでいるコンピューター科学者ですが (統計に精通していないため)、どの統計を使用すればよいかよくわかりません。
概要:
私は (もちろん StackExchange サイトからの) 一連の質問を持っており、このデータを使用して、私が提供したものと同様の質問を見つけるアルゴリズムを調査しています。はい、他の多くの Q&A サイトと同様に、StackExchange サイトは既にこの機能を実行しています。私がやろうとしているのは、このタスクを達成するために人々が採用する方法とアルゴリズムを分析して、どの方法が最も効果的かを調べることです. 私の問題は、「どの方法が最も効果的か」を定量的に判断するための適切な統計的尺度を見つけることです。
データ:
StackExchange の一連の質問があり、それぞれが次のように保存されています{'questionID':"...", 'questionText':"..."}
。質問ごとに、それにリンクされた、またはそこからの一連の他の質問があります。StackExchange サイトの質問回答者が回答に他の同様の投稿へのリンクを追加するのはよくあることです。問題...」これらのリンクされた質問は互いに「類似」していると考えています。
より具体的には、質問があるとしましょうA
。質問A
には、リンクされた質問のコレクションがあります{B, C, D}
。だから A_linked = {B, C, D}
。私の直観は、ここでは推移的な性質が適用されないことを教えてくれます。つまり、が にA
似てB
おり、にA
似ているからといって、 が に似ているとはC
確認できません。(または、できますか?)しかし、 が に似ている場合、はに似ていると自信を持って言えます。B
C
A
B
B
A
したがって、これらの関係を単純化するために、一連の類似したペアを作成します。{A, B}, {A, C}, {A, D}
これらのペアは、ある種のグラウンド トゥルースとして機能します。これらは互いに類似していることがわかっている質問であるため、それらの類似度の信頼値は 1 に等しくなります。similarityConfidence({A,B}) = 1
この設定について注意すべきことは、データセット内の各質問について、類似した質問がいくつかしかわかっていないことです。E
私たちが知らないのは、他の質問も に似ているかどうかA
です。似ているかもしれませんし、似ていないかもしれませんが、わかりません。したがって、私たちの「グラウンド トゥルース」は実際には真実の一部にすぎません。
アルゴリズム:
アルゴリズムの簡略化された疑似コード バージョンは次のとおりです。
これで、q とデータセット内の他のすべての質問との間のコサイン類似度スコアの完全なマッピングができました。私の最終的な目標は、vectorize()
関数の多くのバリエーション (それぞれがわずかに異なるベクトルを返す) に対してこのコードを実行し、コサイン スコアに関してどのバリエーションが最も優れているかを判断することです。
問題:
ここに私の質問があります。それで?これらの余弦スコアがどの程度優れているかを定量的に測定するにはどうすればよいですか?
これらは、私がブレインストーミングした測定値のいくつかのアイデアです (ただし、それらは洗練されておらず、不完全なように感じます)。
二乗平均平方根誤差 (RMSE) に似たある種の誤差関数。したがって、グラウンド トゥルースの類似性リスト内の各ドキュメントについて、二乗誤差を累積します (誤差はおおまかに として定義されます
1-similarities[questionID]
)。次に、その累積を類似のペアの総数で割ります( と同様*2
に考慮するため)。最後に、この誤差の平方根をとります。a->b
b->a
- これらの値は正規化する必要がある場合があるため、これにはある程度の考慮が必要です。のすべてのバリエーションは
vectorize()
0 から 1 の範囲のコサイン スコアを生成しますが、2 つのvectorize()
関数のコサイン スコアは互いに比較できない場合があります。vectorize_1()
は、一般的に各質問のコサイン スコアが高い可能性があるため、スコア .5 は非常に低いスコアである可能性があります。または、vectorize_2()
一般的に各質問の余弦スコアが低い可能性があるため、.5 は非常に高いスコアである可能性があります。この変動をどうにかして説明する必要があります。 - また、 の誤差関数を提案しました
1-similarities[questionID]
。2 つの質問が類似していることがわかっているため、1 を選択しました。したがって、類似度の信頼度は 1 です。ただし、1 のコサイン類似度スコアは、2 つの質問が同一であることを意味します。「リンクされた」質問が同一であると主張しているのではなく、単に類似していると主張しているだけです。これは問題ですか?
- これらの値は正規化する必要がある場合があるため、これにはある程度の考慮が必要です。のすべてのバリエーションは
「類似」として返す質問とそうでない質問のしきい値を設定する限り、リコール (返された類似ドキュメントの数/類似ドキュメントの数) を見つけることができます。
- ただし、上記の理由により、
similarity[documentID]>7
各vectorize()
関数が異なる値を返す可能性があるため、これは事前定義されたしきい値であってはなりません。
- ただし、上記の理由により、
上位 k 件の投稿のみを分析すると、recall @ k を見つけることができます。
- ただし、完全なグラウンド トゥルースがないため、これは問題になる可能性があります。を設定し、関連性があるとわかっている 3 つの
k=5
ドキュメント ( ) のうち 1 つのドキュメント ( ) だけが上位 5 位に入っている場合、他の上位 4 つのドキュメントが実際に、既知の 3つのドキュメントと同等または類似しているかどうかはわかりません。、しかし誰もそれらをリンクしませんでした。B
{B,C,D}
A
- ただし、完全なグラウンド トゥルースがないため、これは問題になる可能性があります。を設定し、関連性があるとわかっている 3 つの
他にアイデアはありますか?どのvectorize()
機能が最もよく機能するかを定量的に測定するにはどうすればよいですか?
algorithm - 類似点の検索を最適化する方法は?
float のベクトルで表される 30,000 個のドキュメントのセットがあります。すべてのベクトルには 100 個の要素があります。ベクトル間のコサイン測定を使用して比較することにより、2 つのドキュメントの類似性を見つけることができます。問題は、最も類似したドキュメントを見つけるのに時間がかかることです。これを高速化するのに役立つアルゴリズムはありますか?
編集
今、私のコードは、最初のベクトルと他のすべてのベクトルの間のコサイン類似度を数えるだけです。約3秒かかります。私はそれをスピードアップしたいと思います ;) アルゴリズムは正確である必要はありませんが、完全な検索と同様の結果が得られるはずです。
各ベクトルの要素の合計は 1 です。