Я пытаюсь вычислить сходство между двумя разреженными векторами, используя косинусное сходство. который работает нормально. Тем не менее, я хотел бы сделать дополнительный шаг, введя взвешивание для каждого индекса вектора. например где векторы для сравнения: v1 = [1, 0, 0, 1, 1] и v2 = [1, 0, 0, 0, 1], а вектор весов имеет вид w = [.5, 1, 1 , 2, 1.5]. Это можно интерпретировать так, что первый элемент вдвое менее важен, чем элементы 2 и 3, а 4-й элемент вдвое важнее, а последний элемент в 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;
}