Как вычислить косинусное сходство с помощью двух матриц


У меня есть две матрицы: A (размерности M x N) и B (N x P). На самом деле, это наборы векторов-векторов строк в A, векторов столбцов в B. Я хочу получить оценки косинусного подобия для каждой пары a и b, где a - вектор (строка) из матрицы A и b - вектор (столбец) из Матрицы B.

Я начал с умножения матриц, в результате чего получилась Матрица C (размеры M x P).

C = A*B

Однако для получения косинусного подобия баллы, мне нужно разделить каждое значение C(i,j) на норму двух соответствующих векторов. Не могли бы вы предложить самый простой способ сделать это в Matlab?

1 5

1 ответ:

Самым простым решением было бы вычисление норм сначала с помощью поэлементного умножения и суммирования вдоль требуемых размеров:

normA = sqrt(sum(A .^ 2, 2));
normB = sqrt(sum(B .^ 2, 1));

normA и normB теперь вектор столбца и вектор строки соответственно. Чтобы разделить соответствующие элементы в A * B на normA и normB, Используйте bsxfun Вот так:

C = bsxfun(@rdivide, bsxfun(@rdivide, A * B, normA), normB);