Реализовать расширенную Jaccard Similairty в pdist MATLAB
Я хочу использовать pdist()
в MATLAB и использовать пользовательскую функцию "Расширенная Jaccard", определенную ниже:
S_EJ(X_a, X_b) = (X_a . X_b) / (||X_a||^2 + ||X_b||^2 - X_a . X_b)
где X_a . X_b
представляет собой внутреннее произведение между векторами X_a
а также X_b
и || ||^2 - норма_2 данного вектора.
Настоятельно рекомендуется воспользоваться bsxfun()
так как он основан на многопоточности. Конечно, если это возможно.
О чем вы думаете:
SEJ(x,y) = bsxfun(@(x, y) (x.*y)./(norm(x)^2 + norm(y)^2 - (x.*y)) , x, y);
Спасибо за ваши мнения заранее.
1 ответ
Ваша функция использует поэлементное умножение.* И деление./, которое выдает векторный вывод, а не число, как ожидается. Вы хотите точечный продукт и регулярное деление.
Допустимые векторы строк:
ej_similarity = (vec1*vec2')/(norm(vec1)^2 + norm(vec2)^2 - vec1*vec2');
Предполагая векторы столбцов:
ej_similarity = (vec1'*vec2)/(norm(vec1)^2 + norm(vec2)^2 - vec1'*vec2);
Обобщено, но немного медленнее:
ej_similarity = (dot(vec1, vec2)/(norm(vec1)^2 + norm(vec2)^2 - dot(vec1,vec2));