Взвешенное косинусное сходство на разреженных векторах

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

Решение

Решено путем взвешивания входного вектора и затем нормализации, спасибо за комментарии.

Другие вопросы по тегам