Реализовать расширенную 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)); 
Другие вопросы по тегам