稀疏向量的加权余弦相似度
Weighted Cosine Similarity on Sparse Vectors
我正在尝试使用余弦相似度计算 2 个稀疏向量之间的相似度。这工作正常。但是,我想采取额外的步骤,为向量的每个索引引入权重。例如其中要比较的向量是 v1 = [1, 0, 0, 1, 1] 和 v2= [1, 0, 0, 0, 1],权重向量类似于 w = [.5, 1, 1] , 2, 1.5]。这可以解释为第一个元素的重要性是元素 2 和 3 的一半,第四个元素的重要性是元素的两倍,而最后一个元素的重要性是相似度的 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;
}
通过对输入向量进行加权然后归一化来解决,感谢您的评论。
我正在尝试使用余弦相似度计算 2 个稀疏向量之间的相似度。这工作正常。但是,我想采取额外的步骤,为向量的每个索引引入权重。例如其中要比较的向量是 v1 = [1, 0, 0, 1, 1] 和 v2= [1, 0, 0, 0, 1],权重向量类似于 w = [.5, 1, 1] , 2, 1.5]。这可以解释为第一个元素的重要性是元素 2 和 3 的一半,第四个元素的重要性是元素的两倍,而最后一个元素的重要性是相似度的 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;
}
通过对输入向量进行加权然后归一化来解决,感谢您的评论。