2016-09-02 32 views
0

私は余弦類似性を使って2つのスパースベクトル間の類似性を計算しようとしています。それはうまく動作しています。しかし、ベクトルの各インデックスに重み付けを導入するという追加のステップを踏みたいと思います。例えば比較するベクトルはv1 = [1,0,0,1,1]、v2 = [1,0,0,0,1]であり、重み付けベクトルはw = [.5,1,1 、2,1.5]。これは、最初の要素が要素2および3の半分であり、4番目の要素が2倍重要であることを意味し、最後の要素は類似性の1.5倍重要であると解釈することができます。スパースベクトルの加重コサイン類似度

コサインの類似性を使用してもこれは可能ですか?もしそうなら、これらの重み付けを組み込むために元の公式をどのように修正するのですか?ありがとう!元のjavaコードは以下の通りです。

private double score(Vector<Double> v1, Vector<Double> v2) throws Exception{ 
    int v1Size = v1.size(); 
    if (v1Size != v2.size()){ 
     throw new Exception("Vectors not same size"); 
    } 
    double numerator = 0; 
    double v1squaresum = 0; 
    double v2squaresum = 0; 
    for (int i = 0; i < v1Size; i++){ 
     double v1Val = v1.get(i); 
     double v2Val = v2.get(i); 
     numerator += (v1Val * v2Val); 
     v1squaresum += (v1Val * v1Val); 
     v2squaresum += (v2Val * v2Val); 
    } 
    if (numerator == 0 || v1squaresum == 0 || v2squaresum == 0){ 
     return 0; 
    } 
    double denom = (Math.sqrt(v1squaresum) * Math.sqrt(v2squaresum)); 
    return numerator/denom; 
} 
+0

[重み付けされた類似性の計算](http://stackoverflow.com/questions/16720549/calculating-a-weighted-similarity)の可能な複製 – bradimus

+0

これはいくつかの助けを提供する必要があります:http://mathforum.org/kb/ message.jspa?messageID = 5658016&tstart = 0 – Yuri

+0

これらの両方を見たことがありますが、最初のメッセージは役に立たず、とにかく正しくありません。そして、私は2番目のものよりも具体的な実装を望んでいましたが、面がなければそのルートに行くかもしれません – holtc

答えて

0

入力ベクトルを重み付けして正規化して解決しました。コメントありがとうございました。

関連する問題