2016-03-16 3 views
0

Я хочу использовать pdist() в MATLAB и использовать пользовательскую функцию «Extended Jaccard» определено, как показано ниже:Реализовать Extended Jaccard Similairty в pdist MATLAB

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); 

Спасибо за Ваше мнение заранее.

+0

так этот дом работа для нас или для вас? По крайней мере, покажите нам, что вы пробовали и сделали до сих пор, пожалуйста. – GameOfThrows

+0

GameOfThrowns, конечно, это не домашнее задание. Мое единственное сомнение состояло в том, чтобы правильно использовать bsxfun(). Функция должна была бы выглядеть так: S_EJ = @ (X_a, X_b) (bsxfun (xxxxxx, X_a, X_b)) – Yas

+0

Я отредактировал вопрос, пожалуйста, посмотрите :-) – Yas

ответ

0

Ваша функция использует элементное умножение. * И деление ./, которое производит векторный вывод, а не число, которое ожидается. Вам нужен точечный продукт и регулярное разделение.

Assumming векторы-строки:

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)); 

 Смежные вопросы

  • Нет связанных вопросов^_^