Взвешенное косинусное сходство на разреженных векторах
Я пытаюсь вычислить сходство между двумя разреженными векторами, используя косинусное сходство. который работает нормально. Тем не менее, я хотел бы сделать дополнительный шаг - ввести взвешивание для каждого индекса вектора. например, где сравниваемые векторы: 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;
}
1 ответ
Решено путем взвешивания входного вектора и затем нормализации, спасибо за комментарии.